Конфигурация сборки для нескольких файлов Django WSGI

У меня есть проект Django с несколькими файлами настроек (www-сайт, мобильный сайт, API...), и недавно мне удалось сократить конфигурацию/развертывание до сборки. К сожалению, единственный способ заставить djangorecipe генерировать для меня отдельные файлы WSGI — это указать каждый сайт как отдельный блок, что создает отдельную библиотеку django для каждого из них.

Я полагаю, что на самом деле это не проблема сама по себе, и обходным путем было бы ручное создание файлов WSGI... но если бы был способ, чтобы все это происходило путем сборки и совместного использования одной и той же библиотеки django, это было бы идеально.

Вот что у меня есть сейчас, что создает отдельные установки Django:

[buildout]
parts =
    python
    web
    mobile
    <etc...>

[python]
recipe = zc.recipe.egg
eggs = <etc...>

[web]
recipe = djangorecipe
interpreter = python
version = trunk
project = proj
settings = web_settings
eggs = ${python:eggs}
wsgi = true

[mobile]
recipe = djangorecipe
interpreter = python
version = ${web:version}
project = ${web:project}
settings = mobile_settings
eggs = ${python:eggs}
wsgi = true

<etc...>

person Dan Breen    schedule 03.03.2011    source источник


Ответы (2)


Поскольку невозможно установить переменную среды в конфигурации apache и получить ее в сценарии wsgi (объяснено в: mod-wsgi wiki) кажется, что самое элегантное решение - иметь отдельные скрипты wsgi.

(На SO было соответствующее обсуждение: Django - Невозможно передать переменную среды Apache/Passenger через интерфейс WSGI)

Теперь, если вы собираетесь создавать сценарии wsgi вручную, вам придется вручную работать с sys.path. Так что кажется, что проще иметь несколько разделов django.recipe.


Также можно вообще не использовать django-recipe. По крайней мере, я предпочитаю это, потому что тогда у меня есть полная свобода настройки моих сценариев wsgi/manage. И не так сложно настроить сборку таким образом, чтобы она переносила написанные вручную сценарии в папку bin с автоматически настроенным sys.path.

Вот как этого добиться:

  • Создайте свой wsgi, управляйте сценариями вручную на myproject.scrpits.*, как описано в документации django. Однако оберните «активную» часть методом def main():. Затем ваши скрипты можно использовать как модули.

  • Создайте правильный setup.py скрипт для вашего проекта. Он установит скрипты, которые вы создали на первом шаге. Здесь важна часть Entry-points:

    from distutils.core import setup
    setup(name='mygroject',
          packages=['myproject'],
          entry_points="""
          [console_scripts]
          manage = myproject.scripts.manage:main
          wsgi = mygroject.scripts.wsgi:main
          """
         )
    
  • Настроить сборку. Здесь важен python:scripts:

    [buildout]
    ...
    # Add directory where your setup.py can be found.
    # I assume that you placed your setup.py in same directory as your buildout file.
    develop=.
    
    [python]
    recipe = zc.recipe.egg:scripts
    # django is no longer instlled by django-recipe so has to be listed in eggs.
    # myproject also has to be listed here.
    eggs= ... django myproject
    # Now scripts from the setup.py:
    scripts = manage wsgi
    # fallowing will create bin/python, might be useful:
    interpreter = python
    
  • Теперь buildout будет генерировать скрипты в папке bin, которую вы определили на шагах 1-2.

person Ski    schedule 03.03.2011
comment
Хм, я не подумал не использовать djangorecipe. Похоже, в моем случае мне нужно будет выполнить индивидуальную настройку, как вы описываете, чтобы получить желаемый результат. Я попробую, спасибо. - person Dan Breen; 04.03.2011

Каждый скрипт wsgi, который вы запускаете за своим веб-сервером, является отдельной сущностью. Итак: модуль настроек django, который вы используете, является единственным отличием? Я имею в виду, вы действительно уверены, что запускать два или более отдельных сайта в одном каталоге безопасно? Позаботьтесь об общих каталогах, которые на самом деле не должны быть общими и так далее. Возможно, более безопасная альтернатива тому, что вы делаете, состоит в том, чтобы просто иметь две отдельные сборки.

С другой стороны, вы говорите, что теперь у вас все работает, используя две части djangorecipe. Ну, в чем настоящая проблема? Хорошо, django дублируется. Пара мегабайт: насколько это плохо? Загрузите три большие фотографии на свой веб-сайт, и они займут столько же места. Итак: ваше текущее решение уже недостаточно хорошо?

Третий комментарий: я думаю, что ваша установка в значительной степени уникальна, поэтому получить поддержку в самом djangorecipe будет сложно. Вы могли бы попытаться заставить его работать, я думаю, что рецепт находится на панели запуска, готовый к разветвлению.

person Reinout van Rees    schedule 04.03.2011
comment
Примечание. Возможно, я немного негативно отношусь к идее иметь два djangorecipes в одной сборке, но на самом деле я собираюсь выяснить, будет ли эта установка хорошей идеей для одного из моих собственных сайтов. Там у меня есть две отдельные сборки, которые в основном одинаковы... :-) - person Reinout van Rees; 04.03.2011
comment
Используя несколько установочных файлов, мы получили возможность использовать разные шаблоны, сайты Django и URL-адреса (домены и urls.py) на отдельных, но в основном одних и тех же сайтах. В целом, я думаю, что это хорошее решение. Но вы правы в том, что наличие нескольких репозиториев Django не имеет большого значения ... Я не думаю, что это когда-либо будет проблемой производительности или чем-то еще, просто немного дополнительного времени во время сборки и незначительная разница в размерах. - person Dan Breen; 04.03.2011