2009-03-24 13 views
5

Come faccio a impostare urlpatterns in base al nome di dominio o TLD, in Django?Come impostare urlpatterns in base al nome di dominio o TLD, in Django?

Per alcuni collegamenti, Amazon mostra l'URL nella lingua nativa in base al sito Web tld.

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

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

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

(i collegamenti sono incompleti e solo mostra come campioni.)

È possibile ottenere il nome host in urls.py? (richiesta oggetto non è disponibile in urls.py) o forse in process_request di middleware e usarlo in urls.py (come ???)

Qualche suggerimento alternativo come ottenere questo?

#---------- 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"), 
         ) 

il formato URL deve essere costruita sulla base di dominio di primo livello e più tardi nel modello, <a href="{% url books %}" >{% trans "books" %}</a> per rendere html come <a href="Bücher">Bücher</a> o <a href="Livres">Livres</a>

risposta

12

Devi fare questo a livello di server web (per esempio usando mod_rewrite in Apache) o con middleware (per esempio this snippet)

anche vedere this SO question


Aggiornamento: dopo il tuo commento ci ho pensato un po 'di più. Mi è piaciuta la risposta di Carl Meyer, ma poi mi sono reso conto che non avrebbe gestito correttamente l'inversione {% url%}. Quindi, ecco cosa farei:

Più siti: È necessario utilizzare il Django sites framework. Il che significa creare istanze di siti per ciascuna lingua usando l'admin di Django.

Impostazioni multiple: Ogni sito di lingua avrà anche il proprio settings.py. Le uniche differenze tra ogni sito saranno le impostazioni SITE_ID e ROOT_URLCONF così, a seguire DRY linea di principio, si dovrebbe mantenere le impostazioni comuni in un file diverso e importarli in file master come questo:

# 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 * 

... e così via.

multipla conf URL: Come descritto in precedenza, una conf URL per ogni sito:

# 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"), 
) 

... e così via.

In questo modo il nome dell'URL (in questo esempio "libri") è lo stesso per tutte le lingue e pertanto {% url books %} si invertirà correttamente e il nome dominio sarà il campo domain_name dell'oggetto Sito con SITE_ID.

Istanze server Web multiple: Per far funzionare correttamente ciascun SITO, ciascuno di essi necessita delle proprie istanze del server. Per Apache + mod_wsgi questo significa un'applicazione WSGI diversa per ogni sito come questo:

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

... e così via insieme con corrispondenti virtual host apache per ogni sito:

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

Speriamo che questo sia chiaro :)

+0

Grazie Van, Forse mi manca il punto dall'altra domanda che mi riferisci. Qui, i pattern URL devono essere creati in base a tld e successivamente nel modello, {% trans "books" %} per il rendering di html come Bücher o Livres e70

+0

Ho aggiornato la domanda per riflettere questo. – e70

+2

Van, Grazie per un resoconto così dettagliato! – e70

-1

In django c'è una tabella chiamata "Siti". Forse puoi fare qualcosa con quello?

8

Probabilmente si può fare questo con un middleware che recupera il TLD tramite request.META ['HTTP_HOST'] e lo antepone a request.path; quindi l'URL rootconf può passare a URLconf specifici della lingua basati sul TLD come primo segmento del percorso URL. Qualcosa di simile (non testata!):

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) 

E nel tuo URLconf:

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

E poi de_urls.py, fr_urls.py e en_urls.py potrebbe avere ciascuno tutti gli URL è necessario in la lingua appropriata