1

我有一个 Django 项目,它有多个设置文件(www 站点、移动站点、一个 API ..),我最近开始削减配置/部署以进行构建。不幸的是,我可以让 djangorecipe 为我生成单独的 WSGI 文件的唯一方法是将每个站点指定为自己的块,这会为每个站点创建一个完整的单独的 django 库。

我想这本身并不是一个真正的问题,解决方法是手动创建 WSGI 文件......但如果有一种方法可以通过构建来实现这一切并共享相同的 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...>
4

2 回答 2

1

由于无法在 apache config 中设置环境变量并在 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 的方式并不难,它会将您手动编写的脚本包装到 bin 文件夹中,并自动配置 sys.path。

以下是如何实现它:

  • myproject.scrpits.*如 django 文档中所述,创建您的 wsgi,手动管理脚本。但是,将“活动”部分包装到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 将在您在步骤 1-2 中定义的 bin 文件夹中生成脚本。

于 2011-03-03T23:44:13.990 回答
1

您在网络服务器后面运行的每个 wsgi 脚本都是一个单独的实体。那么:您使用的 django 设置模块是唯一的区别吗?我的意思是,您真的确定在同一个目录中运行两个或多个单独的站点是安全的吗?照顾不应该真正共享的共享目录等。你正在做的 - 可能更安全 - 替代方案是只拥有两个单独的扩建。

另一方面,你说你现在已经通过使用两个 djangorecipe 部件让它工作了。那么,真正的问题是什么?好的,django 被复制了。几兆字节:这有多糟糕?将三张大照片上传到您的网站,占用的空间相同。那么:您当前的解决方案还不够好吗?

第三条评论:我认为您的设置非常独特,因此很难在 djangorecipe 本身中获得支持。你可以试着让它工作,我认为配方在启动板上,准备好分叉了。

于 2011-03-04T09:59:36.797 回答