Как мне установить urlpatterns на основе доменного имени или TLD в Django? - PullRequest
5 голосов
/ 24 марта 2009

Как мне установить urlpatterns на основе доменного имени или TLD в Django?

Для некоторых ссылок Amazon показывает URL-адрес на родном языке на основе своего веб-сайта tld.

http://www.amazon.de/bücher-buch-literatur/ (de: books => bücher)

http://www.amazon.fr/Nouveautés-paraître-Livres/ (фр .: books => Livres)

http://www.amazon.co.jp/和書-ユーズドブッ-英語学習/ (jp: books => 和 書)

(ссылки неполные и показаны только в качестве примеров.)

Можно ли получить имя хоста в urls.py? (объект запроса недоступен в urls.py) или, может быть, в process_request промежуточного программного обеспечения и используйте его в urls.py (как ???)

Есть альтернативные предложения, как этого добиться?

#---------- pseudocode ---------- 

website_tld = get_host(request).split(".")[-1]

#.fr French  : Books : Livres
#.de German : Books : Bücher

if website_tld == "fr":
    lang_word = "Livres"
elif website_tld == "de":
    lang_word = "Bücher"
else:
    lang_word = "books"

urlpatterns = patterns('',
                       url(r'^%s/$' % lang_word,books_view, name="books"),
                       )

Шаблон URL должен быть построен на основе tld и позже в шаблоне, <a href="{% url books %}" >{% trans "books" %}</a> для отображения HTML как <a href="Bücher">Bücher</a> или <a href="Livres">Livres</a>

Ответы [ 3 ]

12 голосов
/ 24 марта 2009

Это необходимо сделать на уровне веб-сервера (например, с помощью mod_rewrite в Apache) или с промежуточным программным обеспечением (например, этот фрагмент )

Также см. этот ТАК вопрос


Обновление: после вашего комментария я подумал об этом еще немного. Мне понравился ответ Карла Мейера, но потом я понял, что он не справится с реверсированием {% url%} должным образом. Итак, вот что я бы сделал:

Несколько сайтов: Вам необходимо использовать Фреймворк сайтов Django . Это означает создание экземпляров сайта для каждого языка с использованием администратора Django.

Несколько настроек: Каждый языковой сайт также будет иметь свои собственные settings.py. Единственными различиями между каждым сайтом будут настройки SITE_ID и ROOT_URLCONF, поэтому, следуя принципу DRY , вы должны сохранить общие настройки в другом файле и импортировать их в мастер-файл следующим образом:

# settings_fr.py
SITE_ID = 1
ROOT_URLCONF = 'app.urls_fr'
from settings_common import *

# settings_de.py
SITE_ID = 2
ROOT_URLCONF = 'app.urls_de'
from settings_common import *

... и т. Д.

Множественный URL-адрес: Как указано выше, URL-адрес для каждого сайта:

# urls_fr.py
urlpatterns = patterns('',
    url(r'^Livres/$', books_view, name="books"),
)

# urls_de.py
urlpatterns = patterns('',
    url(r'^Bücher/$', books_view, name="books"),
)

... и т. Д.

Таким образом, имя URL (в данном примере "books") одинаково для всех языков, и поэтому {% url books %} будет полностью изменено, и доменное имя будет полем domain_name объекта Site с SITE_ID.

Несколько экземпляров веб-сервера: Для правильной работы каждого САЙТА каждый из них должен иметь свои собственные экземпляры сервера. Для apache + mod_wsgi это означает разные приложения wsgi для каждого САЙТА, ​​например:

# site_fr.wsgi
import os, sys, django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'app.settings_fr'
application = django.core.handlers.wsgi.WSGIHandler()

... и т. Д. Вместе с соответствующим виртуальным хостом apache для каждого сайта:

<VirtualHost *:80>
    ServerName mybooks.fr
    WSGIScriptAlias / /path/to/site_fr.wsgi
    ...
</VirtualHost>

Надеюсь, это понятно :) 1050 *

8 голосов
/ 24 марта 2009

Вы, вероятно, можете сделать это с помощью промежуточного программного обеспечения, которое извлекает TLD через request.META ['HTTP_HOST'] и добавляет его к request.path; тогда ваш корневой URLconf может переключиться на специфичные для языка URLconfs на основе TLD в качестве первого сегмента пути URL. Примерно так (не проверено!):

class PrependTLDMiddleware:
""" Prepend the top level domain to the URL path so it can be switched on in 
a URLconf. """

def process_request(self, request):
    tld = request.META['HTTP_HOST'].split('.')[-1]
    request.path = "/%s%s" % (tld, request.path)

И в вашем URLconf:

urlpatterns = patterns('',
    url(r'^de/' include('de_urls')),
    url(r'^fr/', include('fr_urls')),
    url(r'^[^/]+/', include('en_urls'))
)

И затем каждый из de_urls.py, fr_urls.py и en_urls.py может иметь все необходимые URL-адреса на соответствующем языке.

0 голосов
/ 24 марта 2009

В Django есть таблица под названием «Сайты». Может быть, вы можете что-то сделать с этим?

...