Tenho dois aplicativos localizados em dois computadores separados. No computador A, no urls.py
arquivo, tenho uma linha como a seguinte:
(r'^cast/$', 'mySite.simulate.views.cast')
E esse url funcionará para ambos mySite.com/cast/
e mySite.com/cast
. Mas no computador BI tem um url semelhante escrito como:
(r'^login/$', 'mySite.myUser.views.login')
Por algum motivo, no computador B, o url mySite.com/login
/ funcionará, mas mySite.com/login
travará e não retornará mySite.com/login/
como no computador A. Há algo que perdi? Ambos os url.py
arquivos parecem idênticos a mim.
python
django
django-urls
O que, o que
fonte
fonte
Ou você pode escrever seus urls assim:
(r'^login/?$', 'mySite.myUser.views.login')
O sinal de pergunta após a barra final o torna opcional em regexp. Use-o se, por alguns motivos, você não quiser usar a configuração APPEND_SLASH.
fonte
APPEND_SLASH
, se eles o enviarem acidentalmente sem uma barra final, e seu urlconf estiver COM uma barra final, eles obteriam uma exceção sobre perda de dados ao redirecionar solicitações POST./
) - desleixado, ruim para rastreadores, mais difícil de manter, mais difícil de migrar para um novo sistema (já que é tão fácil de ignorar)Isso melhora a resposta de @Michael Gendin. Sua resposta exibe a página idêntica com dois URLs separados. Seria melhor
login
redirecionar automaticamente paralogin/
e, em seguida, servir o último como a página principal: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"), )
fonte
pattern_name
arg que é usadoredirect
junto com todos os args de url que são correspondidos.Eu também tive o mesmo problema. Minha solução foi colocada um (| /) antes da linha final da minha expressão regular.
url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),
fonte
Anexe a barra sem redirecionar , use-a em vez de CommonMiddleware nas configurações, Django 2.1:
MIDDLEWARE = [ ... # 'django.middleware.common.CommonMiddleware', 'htx.middleware.CommonMiddlewareAppendSlashWithoutRedirect', ... ]
Adicione ao diretório principal do aplicativo 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
fonte
Eu tive o mesmo problema. No meu caso, era uma sobra desatualizada de alguma versão antiga em urls.py, anterior a arquivos estáticos:
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 'django.views.static.serve', kwargs={'document_root': settings.MEDIA_ROOT}),
MEDIA_URL estava vazio, então esse padrão correspondeu a tudo.
fonte