<p><strong>编辑</strong>:<em>请记住,这是一个依赖于平台的答案,而且由于服务于Django的OpenShift平台可能会发生更改,因此该答案可能会无效。截至2016年4月1日,本答复在其整个范围内仍然有效。</em></p>
<p>很多时候,这种情况发生在我身上,因为我必须至少装载5个应用程序,所以我必须创建自己的生命周期:</p>
<ol>
<li>不要使用Django墨盒,而是使用python 2.7墨盒。使用Django购物车。尝试更新django版本会带来很多麻烦,如果你从头开始就这么做的话,就不包括这些麻烦了。</li>
<li><p>通过git克隆存储库。你将得到<code>yourproject</code>和。。。</p>
<pre><code># 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)
</code></pre></li>
<li><p>为克隆到本地计算机中的全新存储库制作一个virtualenv。激活它并通过<code>pip</code>和您需要的所有依赖项(例如,一个新的枕头包,MySQL数据库包,…)安装Django。在那里创建一个django项目。喂,你的DJ项目。<strong>编辑</strong>创建一个<code>wsgi/static</code>目录,其中包含一个空的、虚拟的文件(例如<code>.gitkeep</code>-名称只是约定:您可以使用任何想要的名称)。</p>
<pre><code> #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
</code></pre></li>
<li><p>在那里创建一个django应用程序。说吧,你的应用程序。把它包括在你的项目中。</p></li>
<li><p>你会得到这样的东西(django 1.7):</p>
<pre><code>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
</code></pre></li>
<li><p>像往常一样设置django应用程序(这里我不详细介绍)。请记住相应地在setup.py文件中包含您安装的所有依赖项(这个答案不是描述原因的地方,但是setup.py是包安装程序,openshift使用它在每次部署时重新安装您的应用程序,因此请使其与依赖项保持最新)。</p></li>
<li>为模型创建迁移。</li>
<li><p>按如下所示编辑给定WSGI脚本的openshift。在包含virtualenv(openshift为python墨盒创建一个)之后,您将包括django WSGI应用程序,因此pythonpath将被正确设置。</p>
<pre><code>#!/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
</code></pre></li>
<li><p>编辑钩子。openshift/action_钩子自动执行db sincronization和媒体管理:</p>
<p>建立挂钩</p>
<pre><code>#!/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
</code></pre>
<p>展开挂钩</p>
<pre><code>#!/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
</code></pre></li>
<li><p>现在您已经准备好了wsgi,通过导入指向django wsgi,并且您的脚本正在运行。现在是时候考虑我们在这些脚本中使用的静态和媒体文件的位置了。编辑您的Django设置以告诉您希望这些文件位于何处:</p>
<pre><code>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'),)
</code></pre></li>
<li><p>创建一个示例视图、一个示例模型、一个示例迁移,并推送所有内容。</p></li>
<li><p><strong>编辑</strong>请记住将正确的设置考虑到这两个环境,以便您可以在本地环境和openshift中测试和运行(通常,这需要有一个<code>local_settings.py</code>,如果文件存在,可以选择导入,但我将省略该部分并将所有内容放在同一个文件中)。<strong>请仔细阅读此文件,因为您的localdbname</em><strong>是必须相应设置的值:</p>
<pre><code>"""
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'),)
</code></pre></li>
<li><p>Git添加,提交,推送,享受。</p>
<pre><code>cd path/to/yourproject/
git add .
git commit -m "Your Message"
git push origin master # THIS COMMAND WILL TAKE LONG
# git enjoy
</code></pre></li>
<li><p>你的Django应用程序示例已经准备就绪!但是如果你的应用程序有外部的依赖关系,它会毫无理由的崩溃。这就是我告诉你开发一个简单应用程序的原因。<strong>现在是时候让依赖项工作了。</p>
<p>[<em>未经测试!</em>]假设您的项目中存在requirements.txt文件,您可以编辑deploy hook并在命令<code>cd $OPENSHIFT_REPO_DIR</code>之后添加命令,如下所示:<code>pip install -r requirements.txt</code>。<code>pip</code>应该存在于virtualenv中,但如果不存在,则可以看到下一个解决方案。</p>
<p>或者,setup.py是OpenShift上已经提供的方法。我做了很多次-假设存在requirements.txt文件-是:</p>
<ol>
<li>打开那个文件,读它所有的行。</li>
<li>对于每一行,如果它有一个#,删除#和后面的所有内容。</li>
<li><code>strip</code>前导和尾随空白。</li>
<li>丢弃空的行,并将结果(即剩余行)作为数组。</li>
<li>该结果必须分配给setup.py文件中的<code>setup</code>调用中的<code>install_requires=</code>关键字参数。</li>
</ol>
<p><strong>很抱歉之前我没有将此内容包含在教程中!</strong>但您需要在服务器中实际安装Django。也许这是一个显而易见的建议,每个Python开发人员都可以事先知道。但抓住这个机会,我要说的是:在requirements.txt中包含适当的Django依赖项(或setup.py,取决于您是否使用requirements.txt文件),因为您包含了任何其他依赖项。</p></li>
</ol>
<p>这将有助于您装载Django应用程序,并花了我很多时间来标准化进程。享受吧,如果出了什么问题,请随时通过评论与我联系</p>
<p><strong>编辑</strong>(对于那些有相同问题但不希望在本文的评论中找到答案的人):请记住,如果您在Windows下编辑构建或部署hook文件并推送这些文件,它们将以0644权限飞向服务器,因为Windows不支持此权限方案Unix已经并且无法分配权限,因为这些文件没有任何扩展名。<strong>您会注意到这一点,因为部署时不会执行脚本。因此,尝试仅从基于Unix的系统部署这些文件。</p>
<p><strong>编辑2</strong>:您可以使用git钩子(例如pre_commit)设置某些文件的权限,例如管道脚本(build、deploy,…)。请参阅此答案中@StijndeWitt和@OliverBurdekin的评论,以及<a href="https://stackoverflow.com/questions/21691202/how-to-create-file-execute-mode-permissions-in-git-on-windows">this question</a>了解更多详细信息。</p>