У меня есть два приложения, расположенные на двух разных компьютерах. На компьютере А в urls.py
файле есть такая строка:
(r'^cast/$', 'mySite.simulate.views.cast')
И этот URL-адрес будет работать как для, так mySite.com/cast/
и для mySite.com/cast
. Но на компьютере BI есть похожий URL-адрес, записанный как:
(r'^login/$', 'mySite.myUser.views.login')
По какой-то причине на компьютере B url mySite.com/login
/ будет работать, но mySite.com/login
будет зависать и не будет возвращаться, mySite.com/login/
как на компьютере A. Что-то я пропустил? Оба url.py
файла мне кажутся идентичными.
python
django
django-urls
что-что
источник
источник
Или вы можете написать свои URL-адреса следующим образом:
(r'^login/?$', 'mySite.myUser.views.login')
Знак вопроса после косой черты делает его необязательным в регулярном выражении. Используйте его, если по каким-то причинам вы не хотите использовать настройку APPEND_SLASH.
источник
APPEND_SLASH
, если они случайно отправили его без завершающей косой черты, а ваш urlconf имеет завершающую косую черту, они получат исключение о потере данных при перенаправлении запросов POST./
) - небрежно, плохо для поисковых роботов, сложнее в обслуживании, сложнее перейти на новую систему (так как это так легко не заметить)Это улучшает ответ @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"), )
источник
pattern_name
аргумент, который используетсяredirect
вместе со всеми сопоставленными аргументами URL.У меня тоже была такая же проблема. Мое решение было помещено (| /) перед конечной строкой моего регулярного выражения.
url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),
источник
Добавьте косую черту без перенаправления , используйте ее вместо CommonMiddleware в настройках Django 2.1:
MIDDLEWARE = [ ... # 'django.middleware.common.CommonMiddleware', 'htx.middleware.CommonMiddlewareAppendSlashWithoutRedirect', ... ]
Добавьте в свой основной каталог приложения middleware.py :
from django.http import HttpResponsePermanentRedirect, HttpRequest from django.core.handlers.base import BaseHandler from django.middleware.common import CommonMiddleware from django.conf import settings class HttpSmartRedirectResponse(HttpResponsePermanentRedirect): pass class CommonMiddlewareAppendSlashWithoutRedirect(CommonMiddleware): """ This class converts HttpSmartRedirectResponse to the common response of Django view, without redirect. """ response_redirect_class = HttpSmartRedirectResponse def __init__(self, *args, **kwargs): # create django request resolver self.handler = BaseHandler() # prevent recursive includes old = settings.MIDDLEWARE name = self.__module__ + '.' + self.__class__.__name__ settings.MIDDLEWARE = [i for i in settings.MIDDLEWARE if i != name] self.handler.load_middleware() settings.MIDDLEWARE = old super(CommonMiddlewareAppendSlashWithoutRedirect, self).__init__(*args, **kwargs) def process_response(self, request, response): response = super(CommonMiddlewareAppendSlashWithoutRedirect, self).process_response(request, response) if isinstance(response, HttpSmartRedirectResponse): if not request.path.endswith('/'): request.path = request.path + '/' # we don't need query string in path_info because it's in request.GET already request.path_info = request.path response = self.handler.get_response(request) return response
источник
У меня была такая же проблема. В моем случае это был устаревший остаток какой-то старой версии в urls.py, до создания статических файлов:
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 'django.views.static.serve', kwargs={'document_root': settings.MEDIA_ROOT}),
MEDIA_URL пуст, поэтому этот шаблон соответствует всему.
источник