Webfaction apache + mod_wsgi + Django配置问题

2 投票
2 回答
1652 浏览
提问于 2025-04-15 22:07

最近我遇到了一个问题,虽然我已经解决了,但我还是想听听大家对正确、简单、常用解决方案的看法。

我正在用 Django 和 Python 开发一个网站。当我在本地机器上运行“python manage.py runserver”时,本地地址默认是 http://127.0.0.1:8000/

但是,在生产服务器上,我的应用有其他的 URL,路径像是 "http://server.name/myproj/"。

我需要生成和使用永久的 URL。如果我使用 {% url view params %},我得到的路径是相对于 / 的,因为我的 urls.py 文件里包含了这个

urlpatterns = patterns('',
 (r'^(\d+)?$', 'myproj.myapp.views.index'),
 (r'^img/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/img' }),
 (r'^css/(.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT + '/css' }),
)

到目前为止,我看到两种解决方案:

  1. 修改 urls.py,在生产环境中包含 '/myproj/'
  2. 在 views.py 中使用 request.build_absolute_uri() 来创建链接,或者在模板中传递一个包含 'hostname:port/path' 的变量

有没有更好的方法来解决这个问题呢?谢谢。

更新:看来问题不在 Django,而是在 webfaction 配置 wsgi 的方式。对于 URL 为 "hostname.com/myapp" 的应用,Apache 配置中包含以下内容

WSGIScriptAlias / /home/dreamiurg/webapps/pinfont/myproject.wsgi

所以,SCRIPT_NAME 是空的,我看到的唯一解决方案是使用 mod_python 或者从根目录提供我的应用。有什么想法吗?

2 个回答

2

更改:

WSGIScriptAlias / /home/dreamiurg/webapps/pinfont/myproject.wsgi

为:

WSGIScriptAlias /myproj /home/dreamiurg/webapps/pinfont/myproject.wsgi

然后,把WebFaction的nginx前端配置改成在后端代理到'/myproj',而不是'/'。

这样就应该够了。你在urls.py里不需要使用'/myproj'这个前缀。

换句话说,确保后端的挂载点和前端显示的地方是一样的。

修改WSGI脚本文件来调整SCRIPT_NAME,虽然这样可能有效,但一般不推荐这样做,因为这会让Apache/mod_wsgi无法正常工作,可能会引发其他问题。

3

你不需要做什么特别的事情。Django会自动处理一个叫做SCRIPT_NAME的环境变量,这个变量是由mod_wsgi设置的,当你不是从根目录提供Django网站时,它会自动把这个变量加到网址反转的代码前面。

如果你在使用mod_python(其实不推荐使用这个),你可能需要在Apache的配置中设置django.root

更新 我怀疑这是因为Webfaction通过Apache的代理实例来提供Django网站,这个实例并不知道Webfaction控制面板上实际的挂载点。

在这种情况下,你可能需要在你的.wsgi脚本中手动设置SCRIPT_NAME。我觉得这样做应该可以:

_application = django.core.handlers.wsgi.WSGIHandler()

def application(environ, start_response):
    os.environ['SCRIPT_NAME'] = '/myproj/'
    return _application(environ, start_response)

撰写回答