在中间件安全中通过set_urlconf和request.urlconf修改Djangourlconf吗?
我正在根据请求的主机名更改中间件中的默认 urlconf,并且它在开发过程中按预期工作,但是我担心赛车/线程,因为我在运行时修改了 Django 设置!
我担心的是 Django 会将 urlconfs 与许多并发请求混淆。这是一个有效的担忧吗?
回答
TLDR 版本
你不应该真的需要set_urlconf在你的中间件中使用。您可以自由设置request.urlconf而不必担心线程。
对于 django 处理的每个请求,它将使用ROOT_URLCONF或request.urlconf中间件中设置的值来决定使用什么 urlconf。因此,您不需要使用set_urlconf. 设置request.urlconf是推荐的方式。
这个怎么运作
实际上,在后台,请求通过中间件后,django 会调用此函数,以决定使用哪个 urlconf,因此如果request.urlconf设置了,那么set_urlconf中间件中的任何调用都将无关紧要:
# django.core.handlers.base.py
def resolve_request(self, request):
if hasattr(request, 'urlconf'):
urlconf = request.urlconf
set_urlconf(urlconf)
resolver = get_resolver(urlconf)
查看django 如何处理来自官方文档的请求以获取更多信息。
线程安全 set_urlconf
另请注意, 的实现set_urlconf是线程安全的:
# django.urls.base.py
# Overridden URLconfs for each thread are stored here.
_urlconfs = Local()
def set_urlconf(urlconf_name):
"""
Set the URLconf for the current thread (overriding the default one in
settings). If urlconf_name is None, revert back to the default.
"""
if urlconf_name:
_urlconfs.value = urlconf_name
else:
if hasattr(_urlconfs, "value"):
del _urlconfs.value
(也就是说,它只影响当前线程。)
THE END
二维码