42đź‘Ť
Edit: Remember this is a platform-dependent answer and since the OpenShift platform serving Django may change, this answer could become invalid. As of Apr 1 2016, this answer remains valid at its whole extent.
Many times this happened to me and, since I had to mount at least 5 applications, I had to create my own lifecycle:
- Don’t use the Django cartridge, but the python 2.7 cartridge. Using the Django cart. and trying to update the django version brings many headaches, not included if you do it from scratch.
-
Clone your repository via git. You will get
yourproject
and…# 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)
-
Make a virtualenv for your brand-new repository cloned into your local machine. Activate it and install Django via
pip
and all the dependencies you would need (e.g. a new Pillow package, MySQL database package, …). Create a django project there. Say, yourdjproject. Edit Create, alongside, awsgi/static
directory with an empty, dummy, file (e.g..gitkeep
– the name is just convention: you can use any name you want).#assuming you have virtualenv-wrapper installed and set-up mkvirtualenv myenvironment workon myenvironment pip install Django[==x.y[.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
-
Create a django app there. Say, yourapp. Include it in your project.
-
You will have something like this (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
-
Set up your django application as you’d always do (I will not detail it here). Remember to include all the dependencies you installed, in the setup.py file accordingly (This answer is not the place to describe WHY, but the setup.py is the package installer and openshift uses it to reinstall your app on each deploy, so keep it up to date with the dependencies).
- Create your migrations for your models.
-
Edit the openshift-given WSGI script as follows. You will be including the django WSGI application AFTER including the virtualenv (openshift creates one for python cartridges), so the pythonpath will be properly set up.
#!/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
-
Edit the hooks in .openshift/action_hooks to automatically perform db sincronization and media management:
build hook
#!/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
deploy hook
#!/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
-
Now you have the wsgi ready, pointing to the django wsgi by import, and you have your scripts running. It is time to consider the locations for static and media files we used in such scripts. Edit your Django settings to tell where did you want such 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'),)
-
Create a sample view, a sample model, a sample migration, and PUSH everything.
-
Edit Remember to put the right settings to consider both environments so you can test and run in a local environment AND in openshift (usually, this would involve having a
local_settings.py
, optionally imported if the file exists, but I will omit that part and put everything in the same file). Please read this file conciously since things like yourlocaldbname are values you MUST set accordingly:""" 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'),)
-
Git add, commit, push, enjoy.
cd path/to/yourproject/ git add . git commit -m "Your Message" git push origin master # THIS COMMAND WILL TAKE LONG # git enjoy
-
Your sample Django app is almost ready to go! But if your application has external dependencies it will blow with no apparent reason. This is the reason I told you to develop a simple application. Now it is time to make your dependencies work.
[untested!] You can edit the deploy hook and add a command after the command
cd $OPENSHIFT_REPO_DIR
, like this:pip install -r requirements.txt
, assuming the requirements.txt file exists in your project.pip
should exist in your virtualenv, but if it does not, you can see the next solution.Alternatively, the setup.py is an already-provided approach on OpenShift. What I did many times is -assuming the requirements.txt file exists- is:
- Open that file, read all its lines.
- For each line, if it has a #, remove the # and everything after.
strip
leading and trailing whitespaces.- Discard empty lines, and have the result (i.e. remaining lines) as an array.
- That result must be assigned to the
install_requires=
keyword argument in thesetup
call in the setup.py file.
I’m sorry I did not include this in the tutorial before! But you need to actually install Django in the server. Perhaps an obvious suggestion, and every Python developer could know that beforehand. But seizing this opportunity I remark: Include the appropriate Django dependency in the requirements.txt (or setup.py depending on whetheryou use or not a requirements.txt file), as you include any other dependency.
This should help you to mount a Django application, and took me a lot of time to standarize the process. Enjoy it and don’t hesitate on contacting me via comment if something goes wrong
Edit (for those with the same problem who don’t expect to find the answer in this post’s comments): Remember that if you edit the build or deploy hook files under Windows and you push the files, they will fly to the server with 0644 permissions, since Windows does not support this permission scheme Unix has, and has no way to assign permissions since these files do not have any extension. You will notice this because your scripts will not be executed when deploying. So try to deploy those files only from Unix-based systems.
Edit 2: You can use git hooks (e.g. pre_commit) to set permissions for certain files, like pipeline scripts (build, deploy, …). See the comments by @StijndeWitt and @OliverBurdekin in this answer, and also this question for more details.
7đź‘Ť
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.redhat.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 credentials
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 required 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-redis-cache')
packages.append('hiredis')
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,
)
- [Django]-How to delete project in django
- [Django]-How to override the verbose name of a superclass model field in django
- [Django]-Django model naming convention
3đź‘Ť
These are steps that works for me:
I’ve done some steps manually, but you can automate them later to be done with each push command.
- Create new django app with python-3.3 from website wizard
- Add mysql cartridge to app (my option is mysql)
- git clone created app to local
- add requirements.txt to root folder
- Add myapp to wsgi folder
- Modify application to refer to myapp
- execute git add, commit, push
- Browse app and debug errors with “rhc tail myapp”
-
connect to ssh console
rhc ssh myapp
10.execute this
source $OPENSHIFT_HOMEDIR/python/virtenv/venv/bin/activate
- install missing packages if any
-
go to app directory
cd ~/app-root/runtime/repo/wsgi/app_name
-
do migration with:
python manage.py migrate
-
create super user:
python manage.py createsuperuser
15.Restart the app
- [Django]-How can I check the size of a collection within a Django template?
- [Django]-How to make Django template raise an error if a variable is missing in context
- [Django]-Django model instances primary keys do not reset to 1 after all instances are deleted
1đź‘Ť
This is helpful for me take a look
http://what-i-learnt-today-blog.blogspot.in/2014/05/host-django-application-in-openshift-in.html
- [Django]-Nginx doesn't serve static
- [Django]-How to make python on Heroku https only?
- [Django]-How do I convert datetime.timedelta to minutes, hours in Python?