我最近偶然发现了一个问题,即使我解决了这个问题,我也想听听你对正确/简单/采用的解决方案的看法。
我正在使用Django + python开发网站。当我在本地机器上使用“python manage.py runserver”运行它时,默认情况下本地地址为http://127.0.0.1:8000/。
但是,在生产服务器上,我的应用程序有其他网址,路径为“http://server.name/myproj/”
我需要生成并使用永久网址。如果我正在使用{%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' }),
)
到目前为止,我看到了两个解决方案:
request.build_absolute_uri()
在views.py中创建链接或使用模板中的'hostname:port / path'传递一些变量有更好的方法来解决这个问题吗?谢谢。
更新:好吧,问题似乎不是在django中,而是以webfaction方式配置wsgi。具有URL“hostname.com/myapp”的应用程序的Apache配置包含以下行
WSGIScriptAlias / /home/dreamiurg/webapps/pinfont/myproject.wsgi
所以,SCRIPT_NAME是空的,我看到的唯一解决方案是从mod获取mod_python或从root服务我的应用程序。有什么想法吗?
答案 0 :(得分:3)
你不需要做任何特别的事情。 Django尊重mod_wsgi设置的SCRIPT_NAME
环境变量,当您提供除根之外的Django站点时,并将其自动添加到url反向代码。
如果你正在使用mod_python(你不应该),你可能需要在Apache配置中设置django.root
。
更新我怀疑这是由于Webfaction通过Apache的代理实例为Django站点提供服务的方式 - 该实例不知道Webfaction控制面板确定的实际挂载点。
在这种情况下,您可能需要在SCRIPT_NAME
脚本中手动设置.wsgi
。我认为这应该有效:
_application = django.core.handlers.wsgi.WSGIHandler()
def application(environ, start_response):
os.environ['SCRIPT_NAME'] = '/myproj/'
return _application(environ, start_response)
答案 1 :(得分: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做正确的事情,这可能会产生其他影响。