Django でドメイン名または TLD に基づいて URL パターンを設定するにはどうすればよいですか?
-
21-08-2019 - |
質問
Django でドメイン名または TLD に基づいて URL パターンを設定するにはどうすればよいですか?
一部のリンクについては、Amazon はウェブサイトの TLD に基づいて母国語で URL を表示します。
http://www.amazon.de/bücher-buch-literatur/ (で:本 => ブッチャー )
http://www.amazon.fr/Nouveautés-paraître-Livres/ ( fr :本 => リーブル)
http://www.amazon.co.jp/和書-ユーズドブッ-英語学習/ (jp:本 => 和書 )
(リンクは不完全であり、サンプルとして表示されているだけです。)
urls.pyでホスト名を取得することは可能でしょうか?(request オブジェクトは 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>
解決
これは、Web サーバー レベル (たとえば、Apache の mod_rewrite を使用する) またはミドルウェア (たとえば、 このスニペット)
こちらもご覧ください この質問
アップデート:あなたのコメントの後、私はそれについてもう少し考えました。私は Carl Meyer の答えが気に入りましたが、それでは {% url %} の反転を適切に処理できないことに気付きました。そこで私ならこうします:
複数のサイト: を使用する必要があります。 Django サイト フレームワーク. 。つまり、Django 管理者を使用して各言語のサイト インスタンスを作成します。
複数の設定: 各言語サイトには独自の settings.py もあります。各サイトの唯一の違いは次のとおりです。 SITE_ID
そして ROOT_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 設定: 上で暗示したように、各サイトの 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 オブジェクトの domain_name フィールドになります。 SITE_ID
.
複数の Web サーバー インスタンス: 各サイトが適切に動作するには、それぞれ独自のサーバー インスタンスが必要です。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>
これが明らかだといいのですが:)
他のヒント
あなたはおそらく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を持つことができます。
ジャンゴでは、「サイト」と呼ばれるテーブルがあります。たぶん、あなたはそれで何かを行うことができますか?