Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
406 views
in Technique[技术] by (71.8m points)

session - How do I set urlpatterns based on domain name or TLD, in Django?

How do I set urlpatterns based on domain name or TLD, in Django?

For some links, Amazon shows url in native language based on its website tld.

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

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

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

( the links are incomplete and just show as samples. )

Is it possible to get host name in urls.py? (request object is not available in urls.py) or maybe in process_request of middleware and use it in urls.py(how???)

Any alternate suggestions how to achive this?

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

The url pattern needs to be built based on tld and later in the template, <a href="{% url books %}" >{% trans "books" %}</a> to render html as <a href="Bücher">Bücher</a> or <a href="Livres">Livres</a>

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You have to do this at the webserver level (for example using mod_rewrite in Apache) or with middleware (for example this snippet)

Also see this SO question


Update: after your comment I thought about it some more. I liked Carl Meyer's answer, but then realized it wouldn't handle {% url %} reversing properly. So here's what I would do:

Multiple sites: You need to use the Django sites framework. Which means making site instances for each language using the Django admin.

Multiple settings: Each language site will also have its own settings.py. The only differences between each site will be the SITE_ID and ROOT_URLCONF settings so, to follow DRY principle, you should keep the common settings in a different file and import them into the master file like this:

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

... and so on.

Multiple URL conf: As implied above, a url conf for each site:

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

... and so on.

This way the url name (in this example "books") is the same for all languages, and therefore {% url books %} will reverse properly and the domain name will be the domain_name field of the Site object with SITE_ID.

Multiple web server instances: In order for each SITE to work properly they each need their own server instances. For apache + mod_wsgi this means a different wsgi application for each SITE like this:

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

... and so on along with matching apache virtual host for each site:

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

Hopefully this is clear :)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...