如何在子网址部署Django应用?

4 投票
2 回答
3189 浏览
提问于 2025-04-15 17:50

我需要搭建一个可以在互联网上公开访问的django开发环境(这是为了学校的项目,我的教授需要能看到这些项目,所以这个环境不需要太多安全措施)。我有一台运行Ubuntu 8.04 LTS的虚拟服务器。

我需要在我的主网站的子目录下运行多个django应用。也就是说,我希望mysite.com是一个静态页面,mysite.com/wordpress是我的wordpress博客,而mysite.com/django1、mysite.com/django2等则是我的django项目。

我正在使用apache服务器,并且会使用sqlite或mysql作为数据库。

安装和配置django的方法有很多,几乎和提供建议的网站数量一样多,而且大多数都假设只有一个项目会作为网站的根目录。我非常希望能得到一些帮助,谢谢。

2 个回答

0

这篇博客解释了一个解决方案(假设使用的是mod_wsgi,在nginx/uwsgi下解决方案类似,显然在nginx/uwsgi下这不是必需的)。

WSGIScriptAlias的第一个参数 - /sub-url 会从请求的URL中去掉,剩下的部分会传给你的Django应用。如果你的Django应用的所有URL都以/sub-url开头(而这些会被mod_wsgi去掉),那么你就无法在这些URL上显示视图,除非你把/sub-url重新加回请求路径中。

import django.core.handlers.wsgi

_application = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
    #the line below will re-append the sub-url to all urls
    environ['PATH_INFO'] = environ['SCRIPT_NAME'] + environ['PATH_INFO']
    #this one will make django think that it's the only thing running on the server
    environ['SCRIPT_NAME'] = '' # my little addition to make it work
    return _application(environ, start_response)

而且在你的urls.py文件中,所有的URL都必须以你感兴趣的子URL为前缀。

最后,WSGIScriptAlias必须和你的子URL保持一致:

#the below line will "take-out" the sub-url and pass the rest
#to your wsgi script
WSGIScriptAlias /sub-url /path/to/wsgi_script

文件/path/to/wsgi_script中必须包含application的定义,正如第一个代码片段所示。

为了在Django中明确设置“子URL”,相应的请求路径修补必须在Django框架内进行。

3

你可以在你的

WSGIScriptAlias /django1 /home/keratacon/www/django1/wsgi.py
WSGIScriptAlias /django2 /home/keratacon/www/django2/wsgi.py

中使用这个,前提是你的 wsgi.py 是你 wsgi 脚本的名字,另外你需要在apache+mod_wsgi 配置中设置好。

撰写回答