2009-03-24 6 views
5

Wie stelle ich URL-Muster basierend auf Domain-Namen oder TLDs in Django ein?Wie stelle ich URL-Muster basierend auf Domain-Namen oder TLDs in Django ein?

Für einige Links zeigt Amazon URL in der Muttersprache basierend auf seiner Website Tld.

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

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

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

(die Links sind unvollständig und nur Als Beispiele anzeigen.)

Ist es möglich, in urls.py einen Hostnamen zu erhalten? (Anfrage Objekt ist nicht verfügbar in urls.py) oder vielleicht in process_request der Middleware und benutze es in urls.py (wie ???)

Irgendwelche alternativen Vorschläge, wie dies zu erreichen?

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

Das URL-Muster muss gebaut basierend auf TLD werden und später in der Vorlage, <a href="{% url books %}" >{% trans "books" %}</a> html als <a href="Bücher">Bücher</a> oder <a href="Livres">Livres</a>

Antwort

12

du (zum Beispiel auf dem Webserver Ebene zu tun haben, machen mod_rewrite in Apache) oder mit Middleware (zB this snippet)

siehe auch this SO question


Update: Nach Ihrem Kommentar dachte ich noch etwas darüber nach. Mir gefiel die Antwort von Carl Meyer, aber dann erkannte ich, dass {% url%} nicht korrekt rückgängig gemacht werden konnte. Also hier ist, was ich tun würde:

Mehrere Standorte: Sie müssen die Django sites framework verwenden. Das bedeutet, mit dem Django-Administrator Site-Instanzen für jede Sprache zu erstellen.

Mehrere Einstellungen: Jede Sprachwebsite hat auch ihre eigenen settings.py. Die einzigen Unterschiede zwischen jedem Standort werden die SITE_ID und ROOT_URLCONF Einstellungen so sein, DRY Prinzip zu folgen, sollten Sie die allgemeinen Einstellungen in einer anderen Datei halten und sie in die Master-Datei wie folgt importieren:

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

... und so weiter.

Multiple URL conf: Wie oben angedeutet, eine URL conf für jeden Standort:

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

... und so weiter.

Auf diese Weise ist der URL-Name (in diesem Beispiel "Bücher") für alle Sprachen gleich und daher {% url books %} wird ordnungsgemäß rückgängig gemacht und der Domänenname wird das Domain_name-Feld des Site-Objekts mit SITE_ID sein.

Mehrere Webserver-Instanzen: Damit jede Site ordnungsgemäß funktioniert, benötigen sie jeweils ihre eigenen Serverinstanzen. Für Apache + mod_wsgi bedeutet dies eine andere wsgi Anwendung für jede Seite wie diese:

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

... und so weiter zusammen mit für jeden Standort Apache Zuweisung virtueller Hosts:

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

Hoffentlich ist klar, :)

+0

Danke Van, Vielleicht fehlt mir der Punkt von der anderen Frage, die Sie beziehen. Hier müssen die URL-Muster basierend auf Tld, und später in der Vorlage, {% trans "books" %} erstellt werden, um HTML als Bücher oder Livres e70

+0

zu rendern Ich habe die Frage aktualisiert, um dies zu reflektieren. – e70

+2

Van, Danke für solch eine ausführliche Beschreibung! – e70

-1

In Django gibt es eine Tabelle namens "Sites". Vielleicht kannst du damit etwas anfangen?

8

Sie können dies wahrscheinlich mit einer Middleware tun, die die TLD über request.META ['HTTP_HOST'] abruft und sie an request.path weiterleitet; dann kann Ihre root-URLconf zu sprachspezifischen URL-confs wechseln, die auf der TLD als erstes URL-Pfadsegment basieren. So etwas wie diese (nicht getestet!):

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) 

Und in Ihrem URLconf:

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

Und dann de_urls.py, fr_urls.py und en_urls.py konnten jeweils alle URLs müssen Sie die passende Sprache.

Verwandte Themen