2009-03-24 24 views
5

Làm cách nào để đặt urlpattern dựa trên tên miền hoặc TLD, ở Django?Làm cách nào để đặt urlpattern dựa trên tên miền hoặc TLD, ở Django?

Đối với một số liên kết, Amazon hiển thị url bằng ngôn ngữ gốc dựa trên trang web tld của nó.

http://www.amazon.de/bücher-buch-literatur/ (de: Sách => Bucher)

http://www.amazon.fr/Nouveautés-paraître-Livres/ (fr: Sách => Livres)

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

(các liên kết chưa đầy đủ và chỉ hiển thị dưới dạng mẫu.)

Có thể lấy tên máy chủ lưu trữ trong urls.py không? (đối tượng yêu cầu không có sẵn trong urls.py) hoặc có thể trong process_request của phần mềm trung gian và sử dụng nó trong urls.py (cách ???)

Bất kỳ đề xuất thay thế nào để đạt được điều này?

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

Các mẫu url cần phải được xây dựng dựa trên loại tên miền và sau đó trong mẫu, <a href="{% url books %}" >{% trans "books" %}</a> để render html như <a href="Bücher">Bücher</a> hoặc <a href="Livres">Livres</a>

Trả lời

12

Bạn phải làm điều này ở cấp máy chủ web (ví dụ sử dụng mod_rewrite trong Apache) hoặc với middleware (ví dụ this snippet)

xem thêm this SO question


Cập nhật: sau nhận xét của bạn, tôi đã nghĩ về nó một số chi tiết. Tôi thích câu trả lời của Carl Meyer, nhưng sau đó nhận ra rằng nó sẽ không xử lý đúng cách {% url%}. Vì vậy, đây là những gì tôi sẽ làm:

Nhiều trang web: Bạn cần sử dụng Django sites framework. Điều này có nghĩa là tạo các phiên bản trang web cho từng ngôn ngữ bằng cách sử dụng quản trị Django.

Nhiều cài đặt: Mỗi trang web ngôn ngữ cũng sẽ có settings.py. Sự khác biệt duy nhất giữa mỗi trang web sẽ được các thiết lập SITE_IDROOT_URLCONF như vậy, làm theo DRY Về nguyên tắc, bạn nên giữ các cài đặt chung trong một tập tin khác nhau và nhập chúng vào các tập tin tổng thể như thế này:

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

... và vân vân.

Nhiều URL conf: Như ngụ ý ở trên, một conf url cho mỗi trang web:

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

... và vân vân.

Bằng cách này, tên url (trong ví dụ này là "sách") giống nhau cho tất cả các ngôn ngữ và do đó {% url books %} sẽ đảo ngược đúng cách và tên miền sẽ là trường domain_name của đối tượng Trang web với SITE_ID.

Nhiều phiên bản máy chủ web: Để mỗi SITE hoạt động bình thường thì mỗi SITE cần các phiên bản máy chủ riêng của chúng. Đối với apache + mod_wsgi này có nghĩa là một ứng dụng wsgi khác nhau cho mỗi SITE như thế này:

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

... và vân vân cùng với phù hợp với apache máy chủ ảo cho mỗi trang web:

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

Hy vọng rằng đây là rõ ràng :)

+0

Cảm ơn Vân, Có thể tôi đang thiếu điểm từ câu hỏi khác mà bạn giới thiệu. Ở đây, các mẫu url cần được xây dựng dựa trên tld và sau đó trong mẫu, {% trans "books" %} để hiển thị html là Bücher hoặc Livres e70

+0

Tôi đã cập nhật câu hỏi để phản ánh điều này. – e70

+2

Văn, Cảm ơn bạn đã viết chi tiết như vậy! – e70

-1

Trong django có bảng có tên là "Trang web". Có lẽ bạn có thể làm điều gì đó với điều đó?

8

Bạn có thể làm điều này với phần mềm trung gian để truy lục TLD thông qua request.META ['HTTP_HOST'] và thêm nó vào request.path; thì URL URL gốc của bạn có thể chuyển sang các URLconfs theo ngôn ngữ cụ thể dựa trên TLD làm phân đoạn đường dẫn URL đầu tiên. Một cái gì đó như thế này (chưa được kiểm tra!):

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) 

Và trong URLconf của bạn:

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

Và sau đó de_urls.py, fr_urls.py, và en_urls.py thể mỗi người đều có tất cả các URL mà bạn cần trong ngôn ngữ thích hợp.

Các vấn đề liên quan