在 Django 视图中获取子域?使用 django-hosts 库
Get the subdomain in a Django view? using django-hosts library
我正在用 django 做一个项目。应用程序必须根据子域显示不同的图像和语言。例如:www.mysite.com 将是英语的默认页面,但如果子域是 mx.mysite.com,则语言必须是西班牙语。
我可以使用 django-hosts 将每个子域重定向到不同的 django-app,并且我工作得很好。问题是我只想为所有不同的子域制作一个应用程序,只更改语言。
我认为可以在视图中获取子域并根据子域使用语言呈现模板。但是不知道怎么弄,求大神指教
这是我的 DJANGO HOSTS.PY,主机 'www' 和 'mx' 重定向到同一个应用 'mysite' 但必须使用不同的语言。
from django.conf import settings
from django_hosts import patterns, host
host_patterns = patterns('',
host(r'www', 'mysite.urls', name='www'),
host(r'help', 'help.urls', name='help'),
host(r'mx', 'mysite.urls', name='mx'),
)
一般解决方案
这是一个通用的解决方案,适用于任何支持的语言代码,无需 django-hosts 包。
写一个自定义中间件,检查子域,然后设置session变量LANGUAGE_SESSION_KEY(或者settings.py中LANGUAGE_COOKIE_NAME定义的cookie。默认名字是django_language.) 使用子域中的语言。
自定义中间件:(您可以将其另存为middleware.py在与settings.py相同的文件夹中)
from django.conf import settings
from django.utils.translation import LANGUAGE_SESSION_KEY
class SetLanguageFromSubdomain:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
host = request.get_host()
# Parse language code from the host
lang = host.split('.')[0]
if lang == 'www':
lang = 'en'
# If requested language is in the languages supported by django,
# language_session_key session variable is populated with the
# supported language code.
for django_language in settings.LANGUAGES:
if django_language[0] == lang or django_language[0].endswith('-%s' % lang):
request.session[LANGUAGE_SESSION_KEY] = django_language[0]
break
response = self.get_response(request)
return response
在 settings.py
中的会话和语言环境中间件之间安装此中间件
'django.contrib.sessions.middleware.SessionMiddleware',
#...
# put the middleware here (change projectname to your project's name)
'projectname.middleware.SetLanguageFromSubdomain',
#...
'django.middleware.locale.LocaleMiddleware',
有关 django 如何发现语言偏好的更多信息:https://docs.djangoproject.com/en/2.2/topics/i18n/translation/#how-django-discovers-language-preference
django 支持的语言:https://github.com/django/django/blob/master/django/conf/global_settings.py
有关如何使 Django 项目可翻译的更多信息:https://docs.djangoproject.com/en/2.2/topics/i18n/translation/
有关编写自定义中间件的更多信息:https://docs.djangoproject.com/en/2.2/topics/http/middleware/
我正在用 django 做一个项目。应用程序必须根据子域显示不同的图像和语言。例如:www.mysite.com 将是英语的默认页面,但如果子域是 mx.mysite.com,则语言必须是西班牙语。
我可以使用 django-hosts 将每个子域重定向到不同的 django-app,并且我工作得很好。问题是我只想为所有不同的子域制作一个应用程序,只更改语言。
我认为可以在视图中获取子域并根据子域使用语言呈现模板。但是不知道怎么弄,求大神指教
这是我的 DJANGO HOSTS.PY,主机 'www' 和 'mx' 重定向到同一个应用 'mysite' 但必须使用不同的语言。
from django.conf import settings
from django_hosts import patterns, host
host_patterns = patterns('',
host(r'www', 'mysite.urls', name='www'),
host(r'help', 'help.urls', name='help'),
host(r'mx', 'mysite.urls', name='mx'),
)
一般解决方案
这是一个通用的解决方案,适用于任何支持的语言代码,无需 django-hosts 包。
写一个自定义中间件,检查子域,然后设置session变量LANGUAGE_SESSION_KEY(或者settings.py中LANGUAGE_COOKIE_NAME定义的cookie。默认名字是django_language.) 使用子域中的语言。
自定义中间件:(您可以将其另存为middleware.py在与settings.py相同的文件夹中)
from django.conf import settings
from django.utils.translation import LANGUAGE_SESSION_KEY
class SetLanguageFromSubdomain:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
host = request.get_host()
# Parse language code from the host
lang = host.split('.')[0]
if lang == 'www':
lang = 'en'
# If requested language is in the languages supported by django,
# language_session_key session variable is populated with the
# supported language code.
for django_language in settings.LANGUAGES:
if django_language[0] == lang or django_language[0].endswith('-%s' % lang):
request.session[LANGUAGE_SESSION_KEY] = django_language[0]
break
response = self.get_response(request)
return response
在 settings.py
中的会话和语言环境中间件之间安装此中间件 'django.contrib.sessions.middleware.SessionMiddleware',
#...
# put the middleware here (change projectname to your project's name)
'projectname.middleware.SetLanguageFromSubdomain',
#...
'django.middleware.locale.LocaleMiddleware',
有关 django 如何发现语言偏好的更多信息:https://docs.djangoproject.com/en/2.2/topics/i18n/translation/#how-django-discovers-language-preference
django 支持的语言:https://github.com/django/django/blob/master/django/conf/global_settings.py
有关如何使 Django 项目可翻译的更多信息:https://docs.djangoproject.com/en/2.2/topics/i18n/translation/
有关编写自定义中间件的更多信息:https://docs.djangoproject.com/en/2.2/topics/http/middleware/