在中间件安全中通过set_urlconf和request.urlconf修改Djangourlconf吗?

我正在根据请求的主机名更改中间件中的默认 urlconf,并且它在开发过程中按预期工作,但是我担心赛车/线程,因为我在运行时修改了 Django 设置!

我担心的是 Django 会将 urlconfs 与许多并发请求混淆。这是一个有效的担忧吗?

回答

TLDR 版本

你不应该真的需要set_urlconf在你的中间件中使用。您可以自由设置request.urlconf而不必担心线程。

对于 django 处理的每个请求,它将使用ROOT_URLCONFrequest.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

(也就是说,它只影响当前线程。)


以上是在中间件安全中通过set_urlconf和request.urlconf修改Djangourlconf吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>