django - URL and database routing based on language -
i have urls in following form:
http://example.com/[language_code]/xxx
i need do:
1. based on language code, want select appropriate db or raise http 404 if language code not supported.
2. i'd save language code in request object preferably, can access in templates.
3. i'd urls.py don't this:
url(r'^(?p<lang>\w+)/xxx/$', 'my_app.views.xxx')
but rather:
url(r'^xxx/$', 'my_app.views.xxx')
so django ignore language code in url.
can tell me please if doable django or should solution?
i managed figure out. first of need read docs: https://docs.djangoproject.com/en/dev/topics/i18n/translation/
@1 - wrote own middleware based on http://djangosnippets.org/snippets/2037/ (it's crucial put middleware first 1 in middleware_classes
list)
import threading django.http import http404 django.conf import settings request_cfg = threading.local() class routermiddleware(object): def process_view(self, request, view_func, view_args, view_kwargs): lang = request.language_code if lang in settings.languages: request_cfg.lang = lang else: raise http404() def process_response(self, request, response): if hasattr(request_cfg, 'lang'): del request_cfg.lang return response class databaserouter(object): def _default_db(self): if hasattr(request_cfg, 'lang') , request_cfg.lang in settings.databases: return request_cfg.lang else: return 'default' def db_for_read(self, model, **hints): return self._default_db() def db_for_write(self, model, **hints): return self._default_db()
@2 - can accessed using request.language_code
@3 - it's explained in docs: https://docs.djangoproject.com/en/dev/topics/i18n/translation/#internationalization-in-url-patterns