重新排序 Django 核心功能

问题描述

我遇到了 Django 多站点项目的问题。每个站点都可以处理多种语言。项目通过 URL 处理语言,我们不使用默认语言前缀。例如

  • 站点一:root / 指定俄语,/en 指定站点的英文版本(默认语言为俄语)

  • 站点二:root / 指定英文语言,/ru 指定站点俄文版本(默认语言为英文)

Django 有问题。某些站点的框架缓存解析器和存储前缀。

当我开始为不同的域使用不同的默认语言时,我对错误的前缀感到困惑。由于 hist get_resolver()

,我必须更改 Django @functools.lru_cache decorator 函数的行为

这是 Django 文件:

def get_resolver(urlconf=None):
    if urlconf is None:
        urlconf = settings.ROOT_URLCONF
    return _get_cached_resolver(urlconf)


@functools.lru_cache(maxsize=None)
def _get_cached_resolver(urlconf=None):
    return URLResolver(RegexPattern(r'^/'),urlconf)

我可以做些什么来禁用缓存吗?还是让缓存依赖于站点?

我尝试重新排序 Django 核心模块中的函数

我的解决方案是:

from django.urls.resolvers import URLResolver,RegexPattern

@functools.lru_cache(maxsize=None)
def get_resolver_for_site(site_id,urlconf):
    return URLResolver(RegexPattern(r'^/'),urlconf)


def _get_cached_resolver_for_site(urlconf=None):
    return get_resolver_for_site(get_site().id,urlconf)


@receiver(post_save,sender=SiteSettings)
def clear_url_resolver_cache(sender,**kwargs):
    get_resolver_for_site.cache_clear()


resolvers._get_cached_resolver = _get_cached_resolver_for_site

所以我定义了一个自定义函数,它返回 URL 解析器并缓存它取决于站点。我认为这不是很清楚,这是一个拐杖。

谢谢。

更新

我对错误的前缀感到困惑

如果我的第一个站点和第二个站点有不同的默认语言 - 我有一个项目中我的一个站点的默认语言的 url 前缀(我真的不想要默认语言的语言前缀)。

换句话说,Django 缓存第一个站点的默认语言前缀,它会影响第二个站点。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)