Implementar una aplicación django local usando openshift

Construí una aplicación web usando django. Para poder alojarlo, bash usar openshift pero tengo dificultades para que todo funcione. Parece que hay una falta de paso por paso para esto. Hasta ahora, he estado trabajando bien, la aplicación funciona en el entorno de desarrollo local y he creado con éxito una aplicación en openshift.

Siguiendo la URL en openshift una vez creada, acabo de get la página estándar de "Bienvenido a su aplicación Openshift".

Seguí este https://developers.openshift.com/en/python-getting-started.html#step1 para intentar cambiar el file wsgi.py. Cambié a hello world, lo empujé y aun así sigo teniendo la página pnetworkingeterminada de openshift.

¿Hay algún buen recurso integral para que las aplicaciones locales de Django se puedan ejecutar en Openshift? La mayor parte de lo que puedo encontrar en google son solo ejemplos de aplicaciones que no son tan útiles ya que ya he construido la mía.

Editar : recuerde que esta es una respuesta dependiente de la plataforma y dado que la plataforma OpenShift que sirve Django puede cambiar, esta respuesta podría dejar de ser válida. A partir del 1 de abril de 2016, esta respuesta sigue siendo válida en toda su extensión.

Muchas veces esto me pasó a mí y, como tuve que montar al less 5 aplicaciones, tuve que crear mi propio ciclo de vida:

  1. No use el cartucho de Django, sino el cartucho de python 2.7. Usando el carro de Django. y tratar de actualizar la versión de django trae muchos dolores de cabeza, no incluidos si lo haces desde cero.
  2. Clona tu repository a través de git. Obtendrás tu yourproject y …

     # git clone yourrepo@rhcloud.com:app.git yourproject <- replace it with your actual openshift repo address yourproject/ +---wsgi.py +---setup.py *---.openshift/ (with its contents - I omit them now) 
  3. Haga un virtualenv para su nuevo repository clonado en su máquina local. Actívelo e instale Django vía pip y todas las dependencies que necesite (por ejemplo, un nuevo package Pillow, package de database MySQL, …). Crea un proyecto django allí. Diga, su proyecto. Editar Crear, junto con, un directory wsgi/static con un file vacío, ficticio (por ejemplo, .gitkeep – el nombre es solo una convención: puede usar cualquier nombre que desee).

      #assuming you have virtualenv-wrapper installed and set-up mkvirtualenv myenvironment workon myenvironment pip install Django[==xy[.z]] #select your version; optional. #creating the project inside the git repository cd path/to/yourproject/ django-admin.py startproject yourjdproject . #creating dummy wsgi/static directory for collectstatic mkdir -p wsgi/static touch wsgi/static/.gitkeep 
  4. Crea una aplicación django allí. Dime, yourapp. Incluyelo en tu proyecto.

  5. Tendrás algo como esto (django 1.7):

     yourproject/ +---wsgi/ | +---static/ | +---.gitkeep +---wsgi.py +---setup.py +---.openshift/ (with its contents - I omit them now) +---yourdjproject/ | +----__init__.py | +----urls.py | +----settings.py | +----wsgi.py +---+yourapp/ +----__init__.py +----models.py +----views.py +----tests.py +----migrations +---__init__.py 
  6. Configure su aplicación django como siempre lo haría (no la detallaré aquí). Recuerde include todas las dependencies que instaló, en el file setup.py en consecuencia (Esta respuesta no es el lugar para describir POR QUÉ, pero setup.py es el instalador del package y openshift lo usa para reinstalar su aplicación en cada implementación, por lo tanto, mantenga actualizado con las dependencies).

  7. Crea tus migraciones para tus models.
  8. Edite el script de WSGI dado por openshift de la siguiente manera. Incluirá la aplicación django WSGI DESPUÉS de include el virtualenv (openshift crea uno para los cartuchos de python), por lo que el pythonpath estará configurado correctamente.

     #!/usr/bin/python import os virtenv = os.environ['OPENSHIFT_PYTHON_DIR'] + '/virtenv/' virtualenv = os.path.join(virtenv, 'bin/activate_this.py') try: execfile(virtualenv, dict(__file__=virtualenv)) except IOError: pass from yourdjproject.wsgi import application 
  9. Edite los ganchos en .openshift / action_hooks para realizar automáticamente la synchronization de db y la administración de medios:

    build gancho

     #!/bin/bash #this is .openshift/action/hooks/build #remember to make it +x so openshift can run it. if [ ! -d ${OPENSHIFT_DATA_DIR}media ]; then mkdir -p ${OPENSHIFT_DATA_DIR}media fi ln -snf ${OPENSHIFT_DATA_DIR}media $OPENSHIFT_REPO_DIR/wsgi/static/media ######################### end of file 

    desplegar gancho

     #!/bin/bash #this one is the deploy hook .openshift/action_hooks/deploy source $OPENSHIFT_HOMEDIR/python/virtenv/bin/activate cd $OPENSHIFT_REPO_DIR echo "Executing 'python manage.py migrate'" python manage.py migrate echo "Executing 'python manage.py collectstatic --noinput'" python manage.py collectstatic --noinput ########################### end of file 
  10. Ahora tiene listo el wsgi, apuntando al django wsgi por import, y tiene sus scripts en ejecución. Es hora de considerar las ubicaciones para los files estáticos y multimedia que utilizamos en dichos scripts. Edite su configuration de Django para indicar dónde desea esos files:

     STATIC_URL = '/static/' MEDIA_URL = '/media/' STATIC_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static') MEDIA_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static', 'media') STATICFILES_DIRS = (os.path.join(BASE_DIR, 'yourjdproject', 'static'),) TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'yourjdproject', 'templates'),) 
  11. Cree una vista de muestra, un model de muestra, una migration de muestra y EMPUJE todo.

  12. Editar Recuerde poner las configuraciones correctas para considerar ambos entornos para que pueda probar y ejecutar en un entorno local Y en openshift (generalmente, esto implicaría tener un local_settings.py , opcionalmente importado si el file existe, pero omitiré esa parte y poner todo en el mismo file). Por favor, lea este file conscientemente ya que cosas como yourlocaldbname son valores que DEBE establecer en consecuencia :

     """ Django settings for yourdjproject project. For more information on this file, see https://docs.djangoproject.com/en/1.7/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/1.7/ref/settings/ """ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) ON_OPENSHIFT = False if 'OPENSHIFT_REPO_DIR' in os.environ: ON_OPENSHIFT = True # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.7/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = '60e32dn-za#y=x!551tditnset(o9b@2bkh1)b$hn&0$ec5-j7' # Application definition INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'yourapp', #more apps here ) MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', ) ROOT_URLCONF = 'yourdjproject.urls' WSGI_APPLICATION = 'yourdjproject.wsgi.application' # Database # https://docs.djangoproject.com/en/1.7/ref/settings/#databases if ON_OPENSHIFT: DEBUG = True TEMPLATE_DEBUG = False ALLOWED_HOSTS = ['*'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'youropenshiftgenerateddatabasename', 'USER': os.getenv('OPENSHIFT_MYSQL_DB_USERNAME'), 'PASSWORD': os.getenv('OPENSHIFT_MYSQL_DB_PASSWORD'), 'HOST': os.getenv('OPENSHIFT_MYSQL_DB_HOST'), 'PORT': os.getenv('OPENSHIFT_MYSQL_DB_PORT'), } } else: DEBUG = True TEMPLATE_DEBUG = True ALLOWED_HOSTS = [] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #If you want to use MySQL 'NAME': 'yourlocaldbname', 'USER': 'yourlocalusername', 'PASSWORD': 'yourlocaluserpassword', 'HOST': 'yourlocaldbhost', 'PORT': '3306', #this will be the case for MySQL } } # Internationalization # https://docs.djangoproject.com/en/1.7/topics/i18n/ LANGUAGE_CODE = 'yr-LC' TIME_ZONE = 'Your/Timezone/Here' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.7/howto/static-files/ STATIC_URL = '/static/' MEDIA_URL = '/media/' STATIC_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static') MEDIA_ROOT = os.path.join(BASE_DIR, 'wsgi', 'static', 'media') STATICFILES_DIRS = (os.path.join(BASE_DIR, 'yourdjproject', 'static'),) TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'yourdjproject', 'templates'),) 
  13. Git agrega, cometer, empujar, disfrutar.

     cd path/to/yourproject/ git add . git commit -m "Your Message" git push origin master # THIS COMMAND WILL TAKE LONG # git enjoy 
  14. Su aplicación Django de muestra está casi list para comenzar. Pero si su aplicación tiene dependencies externas, explotará sin motivo aparente. Esta es la razón por la que te dije que desarrolles una aplicación simple. Ahora es el momento de hacer que sus dependencies funcionen .

    [ no probado! ] Puede editar el enganche desplegable y agregar un command después del command cd $OPENSHIFT_REPO_DIR , como este: pip install -r requirements.txt , suponiendo que exista el file requirements.txt en su proyecto. pip debe existir en su virtualenv, pero si no, puede ver la próxima solución.

    Alternativamente, setup.py es un enfoque ya proporcionado en OpenShift. Lo que hice muchas veces es -suponiendo que exista el file requirements.txt- es:

    1. Abra ese file, lea todas sus líneas.
    2. Para cada línea, si tiene un #, elimine el # y todo después.
    3. strip espacios en blanco iniciales y finales.
    4. Deseche las líneas vacías y tenga el resultado (es decir, las líneas restantes) como una matriz.
    5. Ese resultado se debe asignar al argumento de palabra key install_requires= en la llamada de setup en el file setup.py.

    Lamento no haber incluido esto en el tutorial. Pero necesitas instalar Django en el server. Quizás una sugerencia obvia, y cada desarrollador de Python podría saberlo de antemano. Pero aprovechando esta oportunidad, observo: incluya la dependencia de Django apropiada en los requisitos.txt (o setup.py dependiendo de si usa o no un file requirements.txt), ya que incluye cualquier otra dependencia.

Esto debería ayudarlo a montar una aplicación Django, y me llevó mucho time estandarizar el process. Disfrútalo y no dudes en contactarme a través de un comentario si algo sale mal

Editar (para aquellos con el mismo problema que no esperan encontrar la respuesta en los comentarios de esta publicación): recuerde que si edita la compilation o despliega files gancho en Windows y usted empuja los files, volarán al server con 0644 permissions, ya que Windows no admite este esquema de permissions Unix tiene, y no tiene forma de asignar permissions, ya que estos files no tienen ninguna extensión. Notarás esto porque tus scripts no se ejecutarán durante la implementación . Intente desplegar esos files solo desde sistemas basados ​​en Unix.

Editar 2 : puede usar git hooks (por ejemplo, pre_commit) para establecer permissions para ciertos files, como los scripts de canalización (compilation, implementación, …). Vea los comentarios de @StijndeWitt y @OliverBurdekin en esta respuesta, y también esta pregunta para más detalles.

 1) Step 1 install Rubygems Ubuntu - https://rubygems.org/pages/download Windows - https://forwardhq.com/support/installing-ruby-windows $ gem or C:\Windows\System32>gem RubyGems is a sophisticated package manager for Ruby. This is a basic help message containing pointers to more information…….. 2) Step 2: $ gem install rhc Or C:\Windows\System32> gem install rhc 3) $ rhc Or C:\Windows\System32> rhc Usage: rhc [--help] [--version] [--debug] <command> [<args>] Command line interface for OpenShift. 4) $ rhc app create -a mysite -t python-2.7 Or C:\Windows\System32> rhc app create -a mysite -t python-2.7 # Here mysite would be the sitename of your choice #It will ask you to enter your openshift account id and password Login to openshift.networkinghat.com: Enter your openshift id here Password : ********** Application Options --------------------- Domain: mytutorials Cartridges: python-2.7 Gear Size: Default Scaling: no ...... ...... Your application 'mysite' is now available. URL : http://mysite..................... SSH to : 39394949...................... Git remote: ssh://...................... Run 'rhc show-app mysite' for more details about your app. 5) Clone your site $ rhc git-clone mysite Or D:\> rhc git-clone mysite ....................... Your application Git repository has been cloned to "D:\mysite" 6) #”D:\mysite>” is the location we cloned. D:\mysite> git remote add upstream -m master git://github.com/rancavil/django-openshift-quickstart.git D:\mysite> git pull -s recursive -X theirs upstream master 7) D:\mysite> git push remote : ................ remote: Django application cnetworkingentials user: admin xertefkefkt remote: Git Post-Receive Result: success ............. 8) D:\mysite>virtualenv venv --no-site-packages D:\mysite>venv\Scripts\activate.bat <venv> D:\mysite> python setup.py install creating ..... Searching for Django<=1.6 ............. Finished processing dependencies for mysite==1.0 9) Change admin password <venv> D:\mysite\wsgi\openshift> python manage.py changepassword admin password: ... Password changed successfully for user 'admin' <venv> D:\mysite\wsgi\openshift> python manage.py runserver Validating models…. 10) Git add <venv> D:\mysite> git add. <venv> D:\mysite> git commit -am"activating the app on Django / Openshift" ....... <venv> D:\mysite> git push #---------------------------------------------------------------------------------- #-----------Edit your setup.py in mysite with packages you want to install---------- from setuptools import setup import os # Put here requinetworking packages packages = ['Django<=1.6', 'lxml', 'beautifulsoup4', 'openpyxl'] if 'REDISCLOUD_URL' in os.environ and 'REDISCLOUD_PORT' in os.environ and 'REDISCLOUD_PASSWORD' in os.environ: packages.append('django-networkingis-cache') packages.append('hinetworkingis') setup(name='mysite', version='1.0', description='OpenShift App', author='Tanveer Alam', author_email='xyz@gmail.com', url='https://pypi.python.org/pypi', install_requires=packages, ) 

Estos son los pasos que funcionan para mí: he realizado algunos pasos de forma manual, pero puede automatizarlos más adelante para que se hagan con cada command de inserción.

  1. Crear una nueva aplicación django con Python-3.3 desde el asistente del website
  2. Agregar el cartucho de mysql a la aplicación (mi opción es mysql)
  3. git clon creó la aplicación local
  4. agregue requirements.txt a la carpeta raíz
  5. Agregue la carpeta myapp a wsgi
  6. Modificar la aplicación para hacer reference a myapp
  7. ejecuta git add, commit, push
  8. Navegue por los errores de aplicación y debugging con "rhc tail myapp"
  9. conectarse a la console ssh

    rhc ssh myapp

10.execute esto

 source $OPENSHIFT_HOMEDIR/python/virtenv/venv/bin/activate 
  1. instale los packages faltantes si los hay
  2. ir al directory de la aplicación

    cd ~ / app-root / runtime / repo / wsgi / app_name

  3. hacer la migration con:

    python manage.py migrate

  4. crear super usuario:

    python manage.py creauperusuario

15. Reiniciar la aplicación