为什么reverse()会在服务器路径前面添加?

0x4*_*B1D 4 django django-views

我在我的服务器上运行了几个项目实例,如下所示:

http://0.0.0.0/one

http://0.0.0.0/two
Run Code Online (Sandbox Code Playgroud)

我还有一个可通过以下方式访问的激活视图:

http://0.0.0.0/one/activate/u/1/c/123
Run Code Online (Sandbox Code Playgroud)

当我从django shell对此视图执行reverse()时,给出的URL为:

/activate/u/1/c/123
Run Code Online (Sandbox Code Playgroud)

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

/one/activate/u/1/c/123
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?

Dou*_*gal 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/')
Run Code Online (Sandbox Code Playgroud)

  • 具体而言,对于符合WSGI的服务器,服务器提供的每个请求环境中的"SCRIPT_NAME"值将被预先添加.这在Django shell中不存在. (3认同)