【问题标题】:multiple instances of django on a single domain单个域上的多个 django 实例
【发布时间】:2011-03-15 00:36:28
【问题描述】:

我正在寻找一种仅使用一个域名在同一台服务器上安装多个完全不同的 Django 项目的好方法。关键是我想浏览到类似的东西:

http://192.168.0.1/gallery/ # 一个 Django 照片库项目
http://192.168.0.1/blog/ # 一个博客项目

这样,我可以通过引用不同的 URL 在同一台服务器上开发和测试多个 django 项目。 (注意:我不认为这个 Django Sites 模块是我正在寻找的,因为项目需要不同)。例如,PHP 的行为方式就是这样,因为我可以在同一台服务器上安装 php-gallery 和 phpmyadmin 之类的东西,只是使用不同的 URL 路径。

有谁知道如何使用 Apache(使用 mod_python 或 mod_wsgi)在单个服务器上的多个 URL 下设置多个 Django 项目的任何好的资源?我有兴趣知道的是如何设置 apache.conf、可能的 virtualenv 设置以及更改 urls.py 以适应这一点。我看到的大多数 Django 部署示例都是针对每个域或子域的一个应用程序。
非常感谢任何建议。

谢谢,

【问题讨论】:

    标签: python django apache


    【解决方案1】:

    我遇到过无法使用子域的情况,实际上用 Django 处理这个问题的方法非常简单。

    您的设置文件中的几乎所有内容都与常规 Django 应用程序一样,除了确保这些设置包含您的项目路径:

    MEDIA_URL = 'http://192.168.0.1/gallery/media/'
    ADMIN_MEDIA_PREFIX = '/gallery/admin_media/'
    SESSION_COOKIE_PATH = '/gallery'
    LOGIN_REDIRECT_URL = '/gallery/'
    LOGIN_URL = '/gallery/accounts/login/'
    LOGOUT_URL = '/gallery/accounts/logout/'
    

    SESSION_COOKIE_PATH 对于防止同一域中的所有应用重写彼此的 cookie 至关重要。

    以上说明应该涵盖了 Django 端,但在 Web 服务器端还有更多工作要做。例如,如果您使用 apache+mod_wsgi,则需要确保每个项目都有自己的 wsgi 脚本,该脚本的加载方式如下:

    WSGIScriptAlias /gallery /path/to/gallery/apache/gallery.wsgi
    Alias /gallery/media /path/to/gallery/media
    Alias /gallery/admin_media /path/to/gallery/venv/lib/python2.6/site-packages/django/contrib/admin/media
    

    等等

    【讨论】:

    • 感谢这个很好的例子。还需要注意 cookie 路径!
    • 我能够使用这种方法运行一个项目。
    • 您如何处理 i18n_patterns,它会将语言代码添加到模式中,从而绕过您的根 url /gallery/
    【解决方案2】:

    其他人已经介绍了在一个 Django 项目中使用多个应用程序。但是,如果您的意思是项目和/或每个项目中只有一个应用程序,那么简单的答案是如果使用 mod_wsgi,则为每个项目使用单独的 WSGIScriptAlias 指令。每个这样的项目都可以选择委派给一个 mod_wsgi 守护进程组,以便在不重新启动整个 Apache 的情况下单独重新启动每个项目,但守护模式是可以完成的额外操作,而不是解决方案本身。

    【讨论】:

    • 太棒了,我将对 WSGIScriptAlias 指令进行一些研究。谢谢指点。
    【解决方案3】:

    在您的问题中,您似乎在交替使用projectsapps。它们在 Django 中意味着不同的东西。 project 包括设置文件、数据库配置和整体 urlconf,是您在域根目录中想要的。 app 是一段单独的功能代码,(通常)执行一项任务。

    如果您想部署多个应用程序,您需要创建一个项目并将每个应用程序复制到项目目录中。如果您查看本教程,您将了解如何在 urlconf 中包含应用程序。只需对每一个重复一遍,确保正则表达式正确。

    这里的关键是让 apache 为整个 django 项目工作,然后使用 Django 的内部 urlconf 设置每个应用程序可以访问的位置。不要试图在同一个 url 的根目录下运行多个项目——这几乎肯定是你做错了的迹象。

    如果您指的是在一个域下运行多个项目,我们通过子域来解决这个问题。

    由于我们正在构建的 Django 项目(通常)被设计为在实际部署时位于域的根目录,如果您使用 app1.example.comapp2 等,您可以像您一样进行测试在每个域的根目录中进行部署。您可以像配置顶级域一样配置子域,然后轻松进行最终部署。

    如果您尝试实际部署这样的应用程序,请创建一个单一的总体 Django 项目并使用 urlconfs 将每个 Django 应用程序包含在不同的子 URL 中。

    【讨论】:

    • 谢谢保罗。你是对的,我确实混淆了项目和应用程序。我的意思是我想在服务器上部署几个 Django 项目。对困惑感到抱歉。有点希望有一种方法可以在同一台服务器上部署多个 Django 项目,类似于使用 PHP 的方式......本质上是在同一个域下创建一个新的 URL 路径。我知道 PHP 设置和 Django 设置的机制完全不同,但希望得到相同的最终结果:mydomain.com/project1mydomain.com/project2。 ...更多...
    • 我希望避免使用子域,因为我希望消除对外部名称服务(DNS、主机文件)的依赖。这个设置对我来说主要是有用的,作为我的家庭网络上只有 IP 地址(没有运行名称服务)的测试环境,我可能会在不同的开发阶段安装十几个不同的 Django 项目以进行测试。
    • 郑重声明,可以在同一域的特定 url 路径上并排运行 Django 项目,但设置起来并不美观。
    • Gabriel,不知道您使用什么托管机制来声称它的设置并不美观。使用 mod_wsgi 非常简单,而且绝不“不漂亮”。
    • 如果真的只是用于家庭和测试目的,您是否考虑过将它们放在不同的端口上?这再次使得区分它们变得超级容易,并且您使用的 urlconf 与您在生产环境中使用的类似。
    【解决方案4】:

    让我们直接了解术语。

    您在网络上看到的大多数示例都是针对每个域的一个 Django 项目。每个项目可以容纳多个应用程序

    从这里开始,我假设您指的是在单个域上部署多个项目。 (否则 - 您的问题无效)。

    这可以通过对每个目录进行适当的部署来轻松解决(这取决于您使用的部署方法),并确保您的 URL 不假设它们存在于域根目录中。

    【讨论】:

    • 是的,我指的是每个域部署多个项目。对困惑感到抱歉。感谢您的回复
    【解决方案5】:

    一种方法是将应用程序部署到以守护程序模式在 mod_wsgi 下运行的 Apache。文档可以在这里找到:http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango

    【讨论】:

    • 守护程序模式本身不是解决方案,如果他们在谈论不同的项目。
    【解决方案6】:

    制作多个 django 项目,每个项目都有一个应用程序(例如frontend)并使用 django 的 url 映射来执行以下操作:

    from django.conf.urls.defaults import patterns, include
    
    urlpatterns = patterns('',
        url(r'^/', include('myproj.frontend.urls')
    )
    

    我用这个,它顺利脱落。

    如果您要求提供有关设置此类内容的完整教程/演练,很抱歉我没有。我只是按照 Django 文档提出的。

    【讨论】:

      猜你喜欢
      • 2011-11-28
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2012-12-02
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多