Django:在中间件中用 request.urlconf 覆盖 ROOT_URLCONF

Posted

技术标签:

【中文标题】Django:在中间件中用 request.urlconf 覆盖 ROOT_URLCONF【英文标题】:Django: Overwrite ROOT_URLCONF with request.urlconf in middleware 【发布时间】:2015-09-04 20:49:23 【问题描述】:

当请求包含“api”子域时,我试图用另一个 url 覆盖 ROOT_URLCONF,这就是我目前所拥有的。

from django.utils.cache import patch_vary_headers  

class SubdomainMiddleware:
  def process_request(self, request):
    path = request.get_full_path()  
    root_url = path.split('/')[1]
    domain_parts = request.get_host().split('.')

    if (len(domain_parts) > 2):
        subdomain = domain_parts[0]
        if (subdomain.lower() == 'www'):
            subdomain = None
    else:
        subdomain = None

    request.subdomain = subdomain 
    request.domain = domain

    if request.subdomain == "api":
        request.urlconf = "rest_api_example.urls.api"
    else:
        request.urlconf = "rest_api_example.urls.

我也尝试使用“来自 django.core.urlresolvers”的 set_urlconf 模块,但没有成功。我在这里遗漏了什么吗?

【问题讨论】:

【参考方案1】:

有趣的是,我使用 set_urlconf 模块和 request.urlconf 来设置 url 路径,现在它可以工作了!

    from django.core.urlresolvers import set_urlconf
    if request.subdomain == "api":
        set_urlconf("rest_api_example.urls.api")
        request.urlconf = "rest_api_example.urls.api"
    else:
        set_urlconf("rest_api_example.urls.default")
        request.urlconf = "rest_api_example.urls.default"

【讨论】:

这很有趣,set_urlconf() 应该不是必需的,就像 Django 那样here。你有更多关于它为什么“不起作用”的细节吗? 我一直在调查为什么 set_urlconf() 能做到这一点,但我仍然不知道它为什么会起作用。一旦我弄清楚了,我会更新我的答案。 @masanorinyo 我可以在没有文件的情况下加载网址吗? 这个答案很陈旧。我现在在 Django 2.2 上,只是设置 urlconf 似乎工作正常。另外,set_urlconf 现在在 django.urls,但我似乎不需要它。【参考方案2】:

至于 django 中的许多东西,已经有应用程序 - https://github.com/jezdez/django-hosts

【讨论】:

是的,你必须调用 set_urlconf 并在其他地方分配 request.urlconf ,因为疯狂的缓存 urlconf 内部结构它不起作用。

以上是关于Django:在中间件中用 request.urlconf 覆盖 ROOT_URLCONF的主要内容,如果未能解决你的问题,请参考以下文章

express里http.createServer和app.listen有啥区别

在数据库 django 中用特殊字符定义特定数字的最佳方法是啥

如何在 Django 中用小胡子写一些东西

在Django中用数据库值填充下拉列表后如何给它一个特定的值?

Extjs4.2 ajax请求url中传中文參数乱码问题

数字电视机顶盒中的中间件中用的是啥样的矢量字库?