从 WSGI 或 shell 调用时,Django 反转 returns 不同的值
Django reverse returns different values when called from WSGI or shell
我使用 mod_wsgi 在 Apache 服务器上部署了一个 Django 项目,使用前缀 URL /mysite
,即我的 Apache 配置包含
WSGIScriptAlias /mysite /var/www/mysite/mysite/wsgi.py
当从 Web 服务器进程调用 reverse('myview')
(来自 django.core.urlresolvers
)时,它 returns 预期的 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'
有没有办法在 运行 网络服务器上下文之外包含前缀 URL,以便相同的 reverse('myview')
代码可以从 运行两个上下文和 returns 相同的值?
Django 仅在 Web 请求的上下文中期望 SCRIPT_NAME
。它是从 WSGI 环境或 FORCE_SCRIPT_NAME
设置中检索的,并在请求期间设置。
要手动设置脚本名称,请使用 set_script_prefix()
:
from django.core.urlresolvers import set_script_prefix
set_script_prefix('/mysite')
请注意,这是 1) 私有的、未记录的函数,以及 2) 存储在线程局部变量中。
我使用 mod_wsgi 在 Apache 服务器上部署了一个 Django 项目,使用前缀 URL /mysite
,即我的 Apache 配置包含
WSGIScriptAlias /mysite /var/www/mysite/mysite/wsgi.py
当从 Web 服务器进程调用 reverse('myview')
(来自 django.core.urlresolvers
)时,它 returns 预期的 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'
有没有办法在 运行 网络服务器上下文之外包含前缀 URL,以便相同的 reverse('myview')
代码可以从 运行两个上下文和 returns 相同的值?
Django 仅在 Web 请求的上下文中期望 SCRIPT_NAME
。它是从 WSGI 环境或 FORCE_SCRIPT_NAME
设置中检索的,并在请求期间设置。
要手动设置脚本名称,请使用 set_script_prefix()
:
from django.core.urlresolvers import set_script_prefix
set_script_prefix('/mysite')
请注意,这是 1) 私有的、未记录的函数,以及 2) 存储在线程局部变量中。