2

我有以下形式的网址:

http://example.com/[language_code]/xxx

我需要做:
1.根据语言代码,如果语言代码不支持,我想选择合适的DB或引发Http 404。
2. 我想最好将语言代码保存在请求对象中,这样我就可以在我的模板中访问它。
3. 我希望我的 urls.py 看起来不像这样:

url(r'^(?P<lang>\w+)/xxx/$', 'my_app.views.xxx')

反而:

url(r'^xxx/$', 'my_app.views.xxx')

所以 django 将完全忽略 URL 中的语言代码。

谁能告诉我这对 django 是否可行,或者我应该寻找另一种解决方案?

4

1 回答 1

2

我设法弄清楚了这一点。首先,您需要阅读文档:https ://docs.djangoproject.com/en/dev/topics/i18n/translation/

@1 - 我基于http://djangosnippets.org/snippets/2037/编写了自己的中间件(将这个中间件作为MIDDLEWARE_CLASSES列表中的第一个至关重要)

import threading
from django.http import Http404
from 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') and 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 - 可以使用request.LANGUAGE_CODE

@3 - 在文档中有解释:https ://docs.djangoproject.com/en/dev/topics/i18n/translation/#internationalization-in-url-patterns

于 2013-05-16T08:20:32.027 回答