Reorder django core functionality

81 Views Asked by At

I faced the problem of the Django multi-site project. Each site can handle multiple languages. Project handle languages by URL and we don’t use default language prefix. For example

  • Site one: root / specify Russian language and /en specify English version of the site (default language is Russian)

  • Site two: root / specify English language and /ru specify Russian version of the site (default language is English)

Django has a problem. Framework cache resolver and store prefixes for some sites.

When I begin to use different default languages for different domains I was confused with the wrong prefixes. I must change the behaviour of the Django get_resolver() function because of hist @functools.lru_cache decorator

This is the Django file:

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)

Can I do something to disable the cache? Or make cache depend on the site?

I tried to reorder the function in the Django core module

My solution is:

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

So I defined a custom function, that return URL resolver and cache it depends on the site. I think this is not clear and it is a crutch.

Thank you.

UPDATE

I was confused with the wrong prefixes

If I have different default languages for first site and second site - I have url prefix for default language for one of my sites in a project (Really I don't want language prefix for default language).

In other words Django caches prefix for default language for first site and it affects the second site.

0

There are 0 best solutions below