Webfaction apache + mod_wsgi + Django配置问题
最近我遇到了一个问题,虽然我已经解决了,但我还是想听听大家对正确、简单、常用解决方案的看法。
我正在用 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' }),
)
到目前为止,我看到两种解决方案:
- 修改 urls.py,在生产环境中包含 '/myproj/'
- 在 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 个回答
更改:
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无法正常工作,可能会引发其他问题。
你不需要做什么特别的事情。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)