Reputation: 51
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.
Upvotes: 1
Views: 76