2012-03-22 37 views
4

我有我的服务器上运行我的项目的一些情况下,像这样:为什么reverse()预先安装服务器路径?

http://0.0.0.0/one 

http://0.0.0.0/two 

我也有一个激活认为,通过可访问:这个

http://0.0.0.0/one/activate/u/1/c/123 

当我做反向()从Django的观点外壳,给我的网址:

/activate/u/1/c/123 

所以不包括/one服务器路径。但是,当我使用reverse()查找要在项目中的其他位置发送电子邮件的页面路径时,reverse()似乎返回完整的服务器路径+视图路径,如下所示:

/one/activate/u/1/c/123 

有没有人知道为什么会发生这种情况?

+0

您是否在您的web服务器中设置了django.root? – ilvar 2012-03-22 01:53:49

+0

django.root设置仅与mod_python相关。 – 2012-03-22 05:10:16

回答

5

reverse()应该包含此服务器路径,以便您可以在链接中使用它,并且它将工作而无需更改代码中的任何其他内容。但manage.py shell未设置适当的路径前缀;该代码发生在wsgi/etc处理程序中。这是Django bug #16734(我偶然报道:p)。

您可以通过手动拨打django.core.management.base.set_script_prefix来解决此问题,大概是在您的settings.py中。例如:

# when running through wsgi, this will get overriden 
# but it's needed for manage.py 
from django.core.urlresolvers import set_script_prefix 
set_script_prefix('/one/') 
+3

具体而言,对于符合WSGI的服务器,服务器提供的每个请求环境中的'SCRIPT_NAME'的值是前置的。这在Django shell中不存在。 – 2012-03-22 05:11:18

+0

非常酷 - 不知道这件事。顺便说一句,你摇滚格雷厄姆!非常感谢您的专业知识! – 2012-03-22 07:12:20

+0

现在我该如何在没有来自真棒人的帮助下自己弄清楚这一点? :)谢谢,Dougal! – 0x4B1D 2012-03-22 12:14:41