Ответ 1
Изменить. Помните, что это зависит от платформы, и поскольку платформа OpenShift, обслуживающая Django, может измениться, этот ответ может стать недействительным. По состоянию на 1 апреля 2016 года этот ответ остается в силе в полном объеме.
Много раз это происходило со мной, и, поскольку мне приходилось устанавливать не менее 5 приложений, мне пришлось создать собственный жизненный цикл:
- Не используйте картридж Django, а патрон python 2.7. Использование корзины Django. и попытка обновить версию django приносит много головных болей, не включается, если вы делаете это с нуля.
-
Клонирование вашего репозитория через git. Вы получите
yourproject
и...# git clone [email protected]: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 для своего нового репозитория, клонированного на ваш локальный компьютер. Активируйте его и установите Django через
pip
и все зависимости, которые вам понадобятся (например, новый пакет подушек, пакет базы данных MySQL,...). Создайте проект django. Скажем, ваш проект. Изменить Создайте вместе с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. Скажите, yourapp. Включите его в свой проект.
-
У вас будет что-то вроде этого (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 соответственно (этот ответ не является местом для описания ПОЧЕМУ, но setup.py - это установщик пакетов, а openshift использует его для переустановки вашего приложения для каждого развертывания, поэтому храните он обновляется с зависимостями).
- Создайте свои миграции для своих моделей.
-
Отредактируйте WSGI script, указанный при открытии спуска, следующим образом. Вы будете включать приложение WSJI django ПОСЛЕ, включая virtualenv (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 для автоматического выполнения дробления и управления мультимедиа:
построить крюк
#!/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
развернуть 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
-
Теперь у вас есть wsgi ready, указывающий на 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'),)
-
Создайте образец представления, образец модели, образец миграции и PUSH все.
-
Изменить. Не забудьте установить правильные настройки для рассмотрения обеих сред, чтобы вы могли протестировать и запустить в локальной среде AND в режиме спуска (обычно это связано с наличием
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([email protected])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 почти готов к работе! Но если ваше приложение имеет внешние зависимости, оно будет дуть без видимых причин. Именно по этой причине я сказал вам разработать простое приложение. Теперь пришло время, чтобы ваши зависимости работали.
[untested!] Вы можете отредактировать крючок развертывания и добавить команду после команды
cd $OPENSHIFT_REPO_DIR
, например:pip install -r requirements.txt
, предполагая, что файл requirements.txt существует в вашем проекте.pip
должен существовать в вашем virtualenv, но если это не так, вы можете увидеть следующее решение.В качестве альтернативы setup.py - это уже предоставленный подход OpenShift. То, что я делал много раз, заключается в том, что файл требований .txt существует:
- Откройте этот файл, прочитайте все его строки.
- Для каждой строки, если она имеет #, удалите # и все после.
-
strip
ведущие и конечные пробелы. - Отбросить пустые строки и получить результат (т.е. оставшиеся строки) в виде массива.
- Этот результат должен быть назначен аргументу ключевого слова
install_requires=
в вызовеsetup
в файле setup.py.
Простите, что я не включил это в учебник раньше! Но вам нужно фактически установить Django на сервере. Возможно, очевидное предложение, и каждый разработчик Python знал об этом заранее. Но воспользовавшись этой возможностью, я замечаю: включите соответствующую зависимость Django в файле requirements.txt(или setup.py в зависимости от того, используете ли вы файл требований .txt или нет), поскольку вы включаете любую другую зависимость.
Это поможет вам смонтировать приложение Django и потребовало много времени для стандартизации процесса. Наслаждайтесь им и не стесняйтесь обращаться ко мне через комментарий, если что-то пойдет не так.
Изменить (для тех, у кого такая же проблема, которые не ожидали найти ответ в этих комментариях): Помните, что если вы редактируете сборку или развертывание файлов крюка под Windows и вы нажимаете файлы, они будут летать на сервер с разрешениями 0644, поскольку Windows не поддерживает эту схему разрешений, которую имеет Unix, и не имеет возможности назначать разрешения, поскольку эти файлы не имеют расширения. Вы заметите это, потому что ваши скрипты не будут выполняться при развертывании. Поэтому попробуйте развернуть эти файлы только из систем на основе Unix.
Изменить 2. Вы можете использовать git hooks (например, pre_commit) для установки разрешений для определенных файлов, таких как сценарии конвейера (сборка, развертывание,...). См. Комментарии @StijndeWitt и @OliverBurdekin в этом ответе, а также этот вопрос для более подробной информации.