单个域上的多个django实例

时间:2010-07-12 21:17:08

标签: python django apache

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

http://192.168.0.1/gallery/ #jango照片库项目
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部署示例都是针对每个域或子域的一个应用程序 任何建议都非常感谢。

谢谢,

6 个答案:

答案 0 :(得分:15)

我一直处在无法使用子域的情况下,实际上用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

答案 1 :(得分:6)

在您的问题中,您似乎可以互换使用projectsapps。它们意味着Django中的单独事物。 project包括安装文件,数据库配置和整体urlconf,这是您在域的根目录所需的内容。 app是一个单独的功能代码片段(通常)执行一项任务。

如果要部署多个应用程序,则需要创建单个项目并将每个应用程序复制到项目目录中。如果你看一下教程,你会看到如何在urlconf中包含一个应用程序。只需对每一个重复一遍,确保正则表达式是正确的。

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

如果您指的是在单个域下运行多个项目,我们使用子域解决此问题。

由于我们正在构建的Django项目(通常)设计为在实际部署时生活在域的根目录,如果您使用app1.example.comapp2等,您可以测试就像你将在每个域的根目录中部署一样。您可以像配置顶级域一样配置子域,然后转移到最终部署很容易。

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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

让我们直截了当地说明术语。

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

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

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

答案 4 :(得分:1)

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

from django.conf.urls.defaults import patterns, include

urlpatterns = patterns('',
    url(r'^/', include('myproj.frontend.urls')
)

我使用它,它没有任何障碍。

如果您要求完成这样的设置的完整教程/演练,我很抱歉我没有。我只是按照Django文档进行操作,然后提出了这个问题。

答案 5 :(得分:1)

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

相关问题