从 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) 存储在线程局部变量中。