2009-10-20 2 views
57

2 개의 개별 컴퓨터에 두 개의 응용 프로그램이 있습니다. 컴퓨터 A에서 urls.py 파일에서 나는 다음과 같은 라인이 있습니다후행 슬래시가없는 django URL은 리디렉션되지 않습니다.

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

을 그리고 그 URL이 mySite.com/cast/mySite.com/cast 모두 작동합니다. 그러나 컴퓨터에 BI처럼 써 유사한 URL이 : 컴퓨터 B에 대한 몇 가지 이유로

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

url mySite.com/login/작동하지만 mySite.com/login이 중단됩니다 및 컴퓨터에 A.인가 그것은 것처럼 다시 mySite.com/login/에 직접하지 않습니다 내가 놓친 뭔가가 있니? url.py 파일은 모두 저와 동일하게 보입니다.

답변

73

은 settings.py 파일

more info in the django docs

+2

"True로 설정하면 요청 URL은 URLconf과의 패턴과 일치하지 않는 경우 슬래시로 끝나지 않으면 동일한 URL에 슬래시가 추가 된 HTTP 리디렉션이 실행됩니다. 리디렉션으로 인해 POST 요청시 제출 된 모든 데이터가 손실 될 수 있습니다. " "APPEND_SLASH 설정은 CommonMiddleware가 설치된 경우에만 사용됩니다 ...". 나는 Cleaner 솔루션에 대한 Michael Gendin의 대답을 선호합니다. – Wtower

+0

url 패턴의 마지막 항목에서 추가로 "모두 잡기"url을 사용하는 경우에는 작동하지 않습니다. @ speedplane의 대답은 그러한 상황에서도 작동합니다. 그러나 물론, 이것은 더 간단하며 "all catch"urlpattern 항목이없는 경우 사용해야합니다. – np8

139

APPEND_SLASH 설정을 확인 또는 당신은 다음과 같이 URL을 쓸 수 있습니다 :

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

후행 슬래시 후 질문 기호에 그것을 선택합니다 정규식. APPEND_SLASH 설정을 사용하지 않으려는 경우에 사용하십시오.

+6

나에게 전화해라. - 그러나 왜이 대답에는 백만 장의 upvotes와 django faq의 항목이 없습니까? –

+35

SEO 이유로이 작업을 수행하고 싶지는 않을 것입니다. 두 개의 유효한 URL보다 표준 URL로 리디렉션하는 것이 좋습니다. –

+35

Django를 사용하여 RESTful API를 작성하는 경우 개발자가 데이터를 엔드 포인트 URL에 직접 POST 할 때 좋은 해결책이 될 수 있습니다. 'APPEND_SLASH'를 사용할 때 우발적으로 슬래시를 보내지 않고 urlconf에 후행 슬래시가 있으면 POST 요청을 리디렉션 할 때 데이터가 손실된다는 예외가 발생합니다. – OrPo

0

동일한 문제가있었습니다.

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

MEDIA_URL 빈, 그래서이 패턴은 모든 것을 일치 : 내 경우는 staticfiles 전에서 urls.py에서 일부 이전 버전에서 오래된 남은이었다.

2

나는 동일한 문제도 가지고있다. 내 솔루션 정규식의 끝 줄 앞에 (| /) 넣었습니다.

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

9

이것은 @Michael Gendin의 답변을 향상시킵니다. 그의 대답은 두 개의 URL로 된 동일한 페이지를 제공합니다. 자동으로 login/로 리디렉션 한 다음 메인 페이지로 후자를 제공 login을 가지고 더 나은 것 :

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

이것은 매우 훌륭하고 분명한 방법입니다! – Nevertheless