7

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 : 本 => リーヴル )

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>

4

3 に答える 3

13

これは、Web サーバー レベル (Apache で mod_rewrite を使用するなど) またはミドルウェア (このスニペットなど)で行う必要があります。

このSOの質問も参照してください


更新:あなたのコメントの後、私はそれについてもう少し考えました. Carl Meyer の回答は気に入りましたが、{% url %} の反転が適切に処理されないことに気付きました。だからここに私がすることがあります:

複数のサイト: Django サイト フレームワークを使用する必要があります。つまり、Django 管理者を使用して各言語のサイト インスタンスを作成します。

複数の設定:各言語サイトにも独自の settings.py があります。各サイト間の唯一の違いは設定SITE_IDとです。DRYROOT_URLCONFの原則に従うには、共通の設定を別のファイルに保持し、次のようにマスター ファイルにインポートする必要があります。

# 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 名 (この例では「本」) はすべての言語で同じであるため、{% url books %}適切に反転され、ドメイン名は、SITE_ID.

複数の Web サーバー インスタンス:各 SITE が適切に機能するには、それぞれに独自のサーバー インスタンスが必要です。apache + mod_wsgi の場合、これは次のように SITE ごとに異なる 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>

うまくいけば、これは明らかです:)

于 2009-03-24T07:55:07.570 に答える
8

これはおそらく、request.META['HTTP_HOST'] を介して TLD を取得し、それを request.path; の先頭に追加するミドルウェアを使用して行うことができます。次に、ルート URLconf を、最初の URL パス セグメントとして TLD に基づいて言語固有の URLconf に切り替えることができます。このようなもの(テストされていません!):

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)

そしてあなたの URLconf で:

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

そして、de_urls.py、fr_urls.py、en_urls.py のそれぞれに、必要なすべての URL を適切な言語で含めることができます。

于 2009-03-24T14:37:48.680 に答える
-1

django には「Sites」というテーブルがあります。多分あなたはそれで何かをすることができますか?

于 2009-03-24T10:24:24.217 に答える