- 不要使用 Django 墨盒,而是使用 python 2.7 墨盒。使用 Django 购物车。并且尝试更新 django 版本会带来很多麻烦,如果您从头开始,则不包括在内。
-
通过 git 克隆您的存储库。你会得到yourproject 和...
# 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)
-
为克隆到本地计算机的全新存储库创建一个 virtualenv。激活它并通过pip 安装 Django 以及您需要的所有依赖项(例如,新的 Pillow 包、MySQL 数据库包……)。在那里创建一个 django 项目。说,yourdjproject。 编辑在旁边创建一个 wsgi/static 目录,其中包含一个空的虚拟文件(例如 .gitkeep - 名称只是约定:您可以使用任何您想要的名称)。
#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
在那里创建一个 django 应用程序。说,你的应用程序。将其包含在您的项目中。
-
你会有这样的东西(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
像往常一样设置您的 django 应用程序(我不会在这里详细说明)。请记住在 setup.py 文件中相应地包含您安装的所有依赖项(此答案不是描述 WHY 的地方,但 setup.py 是包安装程序,openshift 使用它在每次部署时重新安装您的应用程序,所以请保留它与依赖项保持同步)。
- 为您的模型创建迁移。
-
如下编辑 openshift-given WSGI 脚本。您将在包含 virtualenv 之后包含 django WSGI 应用程序(openshift 为 python 墨盒创建一个),因此 pythonpath 将被正确设置。
#!/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
-
编辑 .openshift/action_hooks 中的钩子以自动执行 db sincronization 和媒体管理:
构建钩子
#!/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
部署钩子
#!/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
-
现在您已准备好 wsgi,通过导入指向 django wsgi,并且您的脚本正在运行。是时候考虑我们在此类脚本中使用的静态和媒体文件的位置了。编辑您的 Django 设置以告知您想要这些文件的位置:
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'),)
创建示例视图、示例模型、示例迁移,然后推送所有内容。
-
编辑请记住将正确的设置考虑到这两种环境,以便您可以在本地环境和 openshift 中测试和运行(通常,这将涉及到 local_settings.py,如果文件存在,但我将省略该部分并将所有内容放在同一个文件中)。 请仔细阅读此文件,因为 yourlocaldbname 是您必须相应设置的值:
"""
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 添加、提交、推送、享受。
cd path/to/yourproject/
git add .
git commit -m "Your Message"
git push origin master # THIS COMMAND WILL TAKE LONG
# git enjoy
-
您的示例 Django 应用程序几乎可以使用了!但是,如果您的应用程序具有外部依赖项,它将无缘无故地崩溃。这就是我告诉你开发一个简单的应用程序的原因。 现在是时候让您的依赖项工作了。
[未经测试!] 您可以编辑部署挂钩并在命令cd $OPENSHIFT_REPO_DIR 之后添加一个命令,如下所示:pip install -r requirements.txt,假设您的项目中存在 requirements.txt 文件。 pip 应该存在于您的 virtualenv 中,但如果不存在,您可以查看下一个解决方案。
另外,setup.py 是 OpenShift 上已经提供的方法。我多次做的是——假设 requirements.txt 文件存在——是:
- 打开该文件,读取其所有行。
- 对于每一行,如果它有一个 #,请删除 # 和后面的所有内容。
-
strip 前导和尾随空格。
- 丢弃空行,并将结果(即剩余的行)作为一个数组。
- 该结果必须分配给 setup.py 文件中
setup 调用中的 install_requires= 关键字参数。
很抱歉我之前没有在教程中包含这个!但是您需要在服务器中实际安装 Django。也许是一个显而易见的建议,每个 Python 开发人员都可以事先知道。但是我要抓住这个机会:在 requirements.txt 中包含适当的 Django 依赖项(或 setup.py 取决于您是否使用 requirements.txt 文件),因为您包含任何其他依赖项。