我有一个Django项目有多个设置文件(www站点,移动站点,API ..),我最近开始将配置/部署切换到buildout。不幸的是,我可以让djangorecipe为我生成单独的WSGI文件的唯一方法是将每个站点指定为自己的块,这为每个站点创建一个完整的独立的django lib。
我认为这本身并不是一个问题,而且解决方法是手动创建WSGI文件......但如果有办法让所有这些都由buildout发生并共享相同的django lib,那就会是理想的。
这就是我现在所拥有的,它创建了单独的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...>
答案 0 :(得分:1)
由于无法在apache配置中设置环境变量并在wsgi脚本中检索它(在mod-wsgi wiki中解释),因此似乎最优雅的解决方案是使用单独的wsgi脚本。
(有关SO的相关讨论:Django - Can't pass Environment Variable to Apache/Passenger on the WSGI Interface)
现在,如果您要手动创建wsgi脚本,则必须手动处理sys.path。因此,似乎django.recipe的几个部分更容易。
也可以根本不使用django-recipe。至少我更喜欢这个,因为那时我可以完全自由地设置我的wsgi / manage脚本。并且以一种方式配置buildout并不难,它会将手动编写的脚本包装到自动配置sys.path的bin文件夹中。
以下是如何实现它:
创建您的wsgi,按照django文档中的说明在myproject.scrpits.*
手动管理脚本。但是,将“活动”部分包装为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
"""
)
配置buildout。 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将在您在步骤1-2中定义的bin文件夹中生成脚本。
答案 1 :(得分:1)
您在网络服务器后面运行的每个wsgi脚本都是一个单独的实体。那么:你使用的django设置模块是唯一的区别吗?我的意思是,您是否确定在同一目录中运行两个或多个单独的站点是安全的?处理不应该真正共享的共享目录。 - 可能更安全 - 替代你所做的只是有两个单独的扩建。
另一方面,你说你现在已经使用了两个djangorecipe部件。那么,真正的问题是什么?好的,django是重复的。几兆字节:这有多糟糕?将三张大照片上传到您的网站,并占用相同的空间。那么:已经不是你当前的解决方案了吗?
第三条评论:我认为您的设置非常独特,因此在djangorecipe本身获得支持将很难。你可以尝试让它工作,我认为配方是在启动板上,准备好分叉。