如何在Django中根据域名或TLD设置urlpatterns?

对于某些链接,Amazon根据其网站tld以本国语言显示url。

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

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

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

(链接不完整,仅显示为示例。)

是否可以在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>

最佳答案

您必须在网络服务器级别(例如在Apache中使用mod_rewrite)或中间件(例如this snippet)执行此操作

另请参阅this SO question

更新:在您发表评论后,我考虑了一下。我喜欢卡尔·梅耶(Carl Meyer)的回答,但后来意识到它无法正确处理{%url%}的反转。所以这就是我要做的:

多个站点:您需要使用Django sites framework。这意味着使用Django管理员为每种语言制作站点实例。

多种设置:每个语言站点也将具有其自己的settings.py。每个站点之间的唯一区别是SITE_IDROOT_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 *

... 等等。

多个URL conf:如上所述,每个站点的url conf:
# 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名称(在本示例中为“books”)都是相同的,因此{% url books %}将正确反转,并且域名将是带有SITE_ID的Site对象的domain_name字段。

多个Web服务器实例:为了使每个SITE正常工作,它们各自需要自己的服务器实例。对于apache + 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()

...等等,以及每个站点的匹配apache虚拟主机:
<VirtualHost *:80>
    ServerName mybooks.fr
    WSGIScriptAlias / /path/to/site_fr.wsgi
    ...
</VirtualHost>

希望这很清楚:)

关于django - 如何在Django中根据域名或TLD设置urlpatterns?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/676457/

10-09 05:55
查看更多