2009-03-24 3 views
5

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

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

http://www.amazon.de/bücher-buch-literatur/ (де: книги => Bücher)

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

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

(ссылки являются неполными и просто показать как образцы.)

Возможно ли получить имя хоста в 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>

ответ

12

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

Также см this SO question


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

Несколько сайтов: Вам необходимо использовать Django sites framework. Это означает создание экземпляров сайтов для каждого языка с помощью администратора 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 * 

... и так далее.

Multiple 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-адреса (в данном примере «книги») одинаково для всех языков, поэтому {% url books %} будет правильно отформатировать, а доменное имя будет полем domain_name объекта сайта с SITE_ID.

Несколько экземпляров веб-сервера: Для того, чтобы каждый САЙТ работал правильно, каждому из них нужны собственные экземпляры сервера. Для апача + 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() 

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

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

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

+0

Спасибо Ван, может быть, я пропустил пункт из другого вопроса, который вы указали. Здесь шаблоны url должны быть построены на основе tld, а затем в шаблоне {% trans "books" %} для рендеринга html как Bücher или Livres e70

+0

Я обновил вопрос, чтобы отразить это. – e70

+2

Ван, спасибо за такую ​​подробную запись! – e70

-1

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

8

Возможно, вы можете сделать это с помощью промежуточного программного обеспечения, которое извлекает 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) 

И в вашем привязок:

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, нужно в соответствующий язык.