2009-10-20 1 views
57

У меня есть два приложения, расположенные на двух отдельных компьютерах. На компьютере А, в файле urls.py У меня есть строка, как следующее:URL-адреса django без привязки косой черты не перенаправляются

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

И что URL будет работать как для mySite.com/cast/ и mySite.com/cast. Но на компьютере BI имеют подобный URL выписанный как:

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

По какой-то причине на компьютере В url mySite.com/login/будет работать, но mySite.com/login будет висеть и не направит обратно mySite.com/login/, как это будет на компьютере A. Является там что-то я пропустил? Оба файла url.py выглядят идентично мне.

ответ

73

проверить настройки APPEND_SLASH в файле settings.py

more info in the django docs

+2

«Если установлено значение Истина, если запрос URL не соответствует ни одному из шаблонов в привязок и ему не заканчивается косой чертой, перенаправление HTTP выдается на тот же URL-адрес с добавлением косой черты. Обратите внимание, что перенаправление может привести к потере любых данных, представленных в запросе POST. ". «Настройка APPEND_SLASH используется, только если установлена ​​CommonMiddleware ...». Я предпочитаю ответ Майкла Гендина для более чистого решения. – Wtower

+0

Это не работает, если вы используете дополнительный URL-адрес «catch all» при последней записи ваших URL-адресов. Ответ на скоростную плоскость будет работать даже в таких ситуациях. Но, конечно, это проще и следует использовать, если нет записей «уловить все» urlpattern. – np8

139

Или вы можете написать свои URLs так:

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

Вопрос знак после слэш делает необязательным в регулярное выражение. Используйте его, если по каким-то причинам вы не хотите использовать параметр APPEND_SLASH.

+6

Назовите меня наивным - но почему этот ответ не получил миллион upvotes и запись в django faq? –

+35

Довольно уверен, что вы не хотите делать это по причинам SEO - лучше перенаправить на канонический URL-адрес, чем два действительных URL-адреса. –

+35

Если вы создаете RESTful API с помощью Django, это может быть хорошим решением, когда разработчики POST-данных напрямую попадают на конечный URL. При использовании 'APPEND_SLASH', если они случайно отправили его без завершающего косая черта, а ваш urlconf WITH WITH trailer slash, они получат исключение из-за потери данных при перенаправлении запросов POST. – OrPo

0

У меня была такая же проблема. В моем случае это был затхлый пережиток какой-то старой версии в urls.py, еще до staticfiles:

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

MEDIA_URL был пуст, так что эта модель соответствует всем.

2

У меня была такая же проблема. Мое решение было помещено (| /) до конечной строки моего регулярного выражения.

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

9

Это улучшает ответ @Michael Гендиным в. Его ответ служит идентичной странице с двумя отдельными 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