Конфигурация сборки для нескольких файлов Django WSGI - PullRequest
1 голос
/ 03 марта 2011

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

Я полагаю, что это не является проблемой как таковой, и обходной путь может заключаться в том, чтобы вручную создавать файлы WSGI ... но если бы был способ добиться того, чтобы все это происходило с помощью buildout и совместно использовало одну и ту же библиотеку 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...>

Ответы [ 2 ]

1 голос
/ 04 марта 2011

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

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

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

1 голос
/ 04 марта 2011

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

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

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


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

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

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

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

    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.

...