Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django reverse在从WSGI或shell调用时返回不同的值_Python_Django_Apache_Mod Wsgi - Fatal编程技术网

Python Django reverse在从WSGI或shell调用时返回不同的值

Python 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

我使用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服务器进程调用
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')