2009-03-24 20 views
5

¿Cómo configuro los patrones url basados ​​en el nombre de dominio o TLD, en Django?¿Cómo configuro los patrones url basados ​​en el nombre de dominio o TLD, en Django?

Para algunos enlaces, Amazon muestra la url en el idioma nativo según su sitio web tld.

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

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

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

(los enlaces son incompletos y justo mostrar como ejemplos.)

¿Es posible obtener el nombre de host en urls.py? (el objeto request no está disponible en urls.py) o quizás en process_request de middleware y lo usa en urls.py (¿cómo?)

¿Alguna sugerencia alternativa de cómo lograr esto?

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

el patrón de URL tiene que ser construido sobre la base de dominio de nivel superior y más tarde en la plantilla, <a href="{% url books %}" >{% trans "books" %}</a> a representar HTML como <a href="Bücher">Bücher</a> o <a href="Livres">Livres</a>

Respuesta

12

Tienes que hacer esto a nivel de servidor web (por ejemplo, usando mod_rewrite en Apache) o con el middleware (por ejemplo this snippet)

véase también this SO question


Actualización: después de su comentario, lo pensé un poco más. Me gustó la respuesta de Carl Meyer, pero luego me di cuenta de que no manejaría {% url%} invertir correctamente. Así que esto es lo que haría:

Varios sitios: Debe usar el Django sites framework. Lo que significa crear instancias de sitio para cada idioma con el administrador de Django.

Configuraciones múltiples: Cada sitio de idioma también tendrá su propia configuración.py. Las únicas diferencias entre cada sitio serán los ajustes SITE_ID y ROOT_URLCONF así, seguir DRY principio, debe mantener los ajustes comunes en un archivo diferente e importarlos en el archivo maestro de esta manera:

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

... y así.

múltiple URL conf: Como implicaba anteriormente, un conf url para cada sitio:

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

... y así sucesivamente.

De esta manera el nombre de la url (en este ejemplo "libros") es el mismo para todos los idiomas, y por lo tanto {% url books %} se invertirá correctamente y el nombre de dominio será el campo domain_name del objeto Site con SITE_ID.

Instancias de servidor web múltiples: Para que cada SITIO funcione correctamente, cada uno necesita sus propias instancias de servidor. Para Apache + mod_wsgi esto significa una aplicación WSGI diferente para cada sitio como este:

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

... y así sucesivamente junto con el juego de host virtual Apache para cada sitio:

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

Esperemos que esto es clara :)

+0

Gracias Van, Tal vez estoy perdiendo el punto de la otra pregunta que refieres. Aquí, los patrones de URL deben construirse en base a tld, y más tarde en la plantilla, {% trans "books" %} para representar html como Bücher o Livres e70

+0

He actualizado la pregunta para reflejar esto. – e70

+2

Van, ¡gracias por una reseña tan detallada! – e70

-1

En django hay una tabla llamada "Sitios". ¿Tal vez puedes hacer algo con eso?

8

Probablemente pueda hacer esto con un middleware que recupera el TLD a través de request.META ['HTTP_HOST'] y lo antepone a request.path; luego, su URLconf raíz puede cambiar a URLconfs específicos del idioma basados ​​en el TLD como el primer segmento de ruta URL. Algo como esto (no probado!):

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) 

Y en tu URLconf:

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

Y luego de_urls.py, fr_urls.py y en_urls.py podría tener cada uno todas las direcciones URL que necesita en el lenguaje apropiado

Cuestiones relacionadas