2009-10-20 52 views
57

Tôi có hai ứng dụng nằm trên hai máy tính riêng biệt. Trên máy tính A, trong file urls.py Tôi có một dòng như sau:url django không có dấu gạch chéo không chuyển hướng

(r'^cast/$', 'mySite.simulate.views.cast') 

Và url rằng sẽ làm việc cho cả hai mySite.com/cast/mySite.com/cast. Nhưng trên máy tính của BI có một url tương tự được viết ra như:

(r'^login/$', 'mySite.myUser.views.login') 

Đối với một số lý do trên máy tính B url mySite.com/login/sẽ làm việc nhưng mySite.com/login sẽ treo và sẽ không trực tiếp trở lại mySite.com/login/ như nó sẽ trên máy tính A. có cái gì tôi bị mất? Cả hai url.py tệp trông giống hệt với tôi.

Trả lời

73

kiểm tra thiết lập APPEND_SLASH của bạn trong file settings.py

more info in the django docs

+2

"Khi đặt thành True, nếu URL yêu cầu không phù hợp với bất cứ mẫu nào trong URLconf và nó không kết thúc bằng dấu gạch chéo, chuyển hướng HTTP được cấp cho cùng một URL có dấu gạch chéo được nối thêm. Lưu ý rằng chuyển hướng có thể khiến bất kỳ dữ liệu nào được gửi trong yêu cầu POST bị mất. ". "Cài đặt APPEND_SLASH chỉ được sử dụng nếu CommonMiddleware được cài đặt ...". Tôi thích câu trả lời của Michael Gendin cho một giải pháp sạch hơn. – Wtower

+0

Tính năng này không hoạt động nếu bạn đang sử dụng url "bắt tất cả" bổ sung ở mục nhập cuối cùng của mẫu url của bạn. @ speedplane của câu trả lời sẽ làm việc ngay cả ở những tình huống. Nhưng, tất nhiên, điều này đơn giản hơn và nên được sử dụng nếu không có các mục nhập urlpattern "bắt tất cả". – np8

139

Hoặc bạn có thể viết các url của bạn như thế này:

(r'^login/?$', 'mySite.myUser.views.login') 

Dấu câu hỏi sau dấu gạch chéo làm cho nó bắt buộc trong regexp. Sử dụng nó nếu vì một số lý do bạn không muốn sử dụng cài đặt APPEND_SLASH.

+6

Hãy gọi cho tôi ngây thơ - nhưng tại sao câu trả lời này không có một triệu upvotes và một mục trong faq django? –

+35

Khá chắc chắn bạn không muốn làm điều này vì lý do SEO - tốt hơn để chuyển hướng đến một URL chuẩn hơn có hai URL hợp lệ. –

+35

Nếu bạn đang creting một RESTful API bằng cách sử dụng Django, đây có thể là một giải pháp tốt khi các nhà phát triển POST dữ liệu trực tiếp đến URL điểm cuối. Khi sử dụng 'APPEND_SLASH', nếu họ vô tình gửi nó mà không có dấu gạch chéo, và urlconf của bạn là WITH dấu gạch chéo, họ sẽ nhận được một ngoại lệ về dữ liệu bị mất khi chuyển hướng các yêu cầu POST. – OrPo

0

Tôi đã gặp sự cố tương tự. Trong trường hợp của tôi, đó là một phần còn lại cũ từ một số phiên bản cũ trong urls.py, từ trước các tệp tĩnh:

url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 
    'django.views.static.serve', 
    kwargs={'document_root': settings.MEDIA_ROOT}), 

MEDIA_URL trống, vì vậy mẫu này khớp với mọi thứ.

2

Tôi cũng gặp vấn đề tương tự. Giải pháp của tôi đã được đặt dấu (| /) trước dòng cuối của cụm từ thông dụng của tôi.

url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),

9

Điều này cải thiện câu trả lời của @Michael Gendin. Câu trả lời của anh ta phục vụ trang giống hệt nhau với hai URL riêng biệt. Nó sẽ là tốt hơn để có login tự động chuyển hướng đến login/, và sau đó phục vụ sau này như trang chính:

from django.conf.urls import patterns 
from django.views.generic import RedirectView 

urlpatterns = patterns('', 
    # Redirect login to login/ 
    (r'^login$', RedirectView.as_view(url = '/login/')), 
    # Handle the page with the slash. 
    (r'^login/', "views.my_handler"), 
) 
+2

Đây là một cách rất tốt đẹp và rõ ràng! – Nevertheless

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