Python Django reverse在从WSGI或shell调用时返回不同的值
我使用mod_wsgi在Apache服务器上部署了一个Django项目,使用前缀URLPython Django reverse在从WSGI或shell调用时返回不同的值,python,django,apache,mod-wsgi,Python,Django,Apache,Mod Wsgi,我使用mod_wsgi在Apache服务器上部署了一个Django项目,使用前缀URL/mysite,即我的Apache配置包含 WSGIScriptAlias /mysite /var/www/mysite/mysite/wsgi.py 当从web服务器进程调用reverse('myview')(来自django.core.urlresolvers)时,它返回预期的URL/mysite/myview,即包括前缀URL 但是,当从脚本(例如cronjob)而不是通过web服务器进程调用reve
/mysite
,即我的Apache配置包含
WSGIScriptAlias /mysite /var/www/mysite/mysite/wsgi.py
当从web服务器进程调用reverse('myview')
(来自django.core.urlresolvers
)时,它返回预期的URL/mysite/myview
,即包括前缀URL
但是,当从脚本(例如cronjob)而不是通过web服务器进程调用reverse('myview')
时,只返回/myview
,而不返回所需的前缀URL。我的示例脚本如下所示:
import sys
import os
import django
sys.path.append('/var/www/mysite')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
django.setup()
from django.core.urlresolvers import reverse
print reverse('myview') # prints '/myview'
在web服务器上下文之外运行时,是否有方法包含前缀URL,以便相同的
reverse('myview')
代码可以从两个上下文运行并返回相同的值?Django只希望在web请求的上下文中使用脚本名称。它从WSGI环境或FORCE\u SCRIPT\u NAME
设置中检索,并针对请求的持续时间进行设置
要手动设置脚本名称,请使用set\u script\u prefix()
:
请注意,这是1)一个私有的、未记录的函数,2)存储在线程局部变量中。虽然不是完全重复的(WSGI与常规python脚本,而不是Django shell与常规python脚本),但解决方案可能适用于此,也可以。使用FORCE\u SCRIPT\u NAME
settings我尝试在settings.py
中添加FORCE\u SCRIPT\u NAME='/mysite'
,但是从脚本调用时对reverse('myview')
的输出没有影响。这确实有效,所以我接受答案。不过,最好不要求助于未记录的函数。没有更好的方法是有原因的吗,即我是否以我不应该使用的方式使用了反向
?我的用例是一个cronjob,它发送包含网站链接的电子邮件,显然应该包含正确的前缀URL。
from django.core.urlresolvers import set_script_prefix
set_script_prefix('/mysite')