두 개의 별도 컴퓨터에 두 개의 응용 프로그램이 있습니다. 컴퓨터 A의 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
파일 모두 나와 똑같아 보입니다.
답변
답변
또는 다음과 같이 URL을 작성할 수 있습니다.
(r'^login/?$', 'mySite.myUser.views.login')
후행 슬래시 뒤의 질문 기호는 정규 표현식에서 선택 사항입니다. 어떤 이유로 APPEND_SLASH 설정을 사용하지 않으려면 사용하십시오.
답변
이것은 @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"),
)
답변
나도 같은 문제가 있었다. 내 솔루션은 정규 표현식의 끝 줄 앞에 (| /)를 넣었습니다.
url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),
답변
redirect없이 슬래시 를 추가 하고 설정에서 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
답변
나는 같은 문제가 있었다. 제 경우에는 staticfiles 이전의 urls.py의 일부 이전 버전에서 남은 오래된 버전이었습니다.
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'),
'django.views.static.serve',
kwargs={'document_root': settings.MEDIA_ROOT}),
MEDIA_URL이 비어있어서이 패턴이 모든 것과 일치했습니다.