Tengo dos aplicaciones ubicadas en dos computadoras separadas. En la computadora A, en el urls.py
archivo tengo una línea como la siguiente:
(r'^cast/$', 'mySite.simulate.views.cast')
Y esa URL funcionará para ambos mySite.com/cast/
y mySite.com/cast
. Pero en la computadora BI, tenga una URL similar escrita como:
(r'^login/$', 'mySite.myUser.views.login')
Por alguna razón, en la computadora B, el url mySite.com/login
/ funcionará pero mySite.com/login
se bloqueará y no volverá mySite.com/login/
como lo haría en la computadora A. Ambos url.py
archivos me parecen idénticos.
python
django
django-urls
que que
fuente
fuente
O puede escribir sus URL de esta manera:
(r'^login/?$', 'mySite.myUser.views.login')
El signo de pregunta después de la barra diagonal al final lo hace opcional en regexp. Úselo si por alguna razón no desea usar la configuración APPEND_SLASH.
fuente
APPEND_SLASH
, si lo enviaron accidentalmente sin barra diagonal final, y su urlconf está CON una barra diagonal final, obtendrán una excepción sobre la pérdida de datos al redirigir las solicitudes POST./
): descuidado, malo para los rastreadores, más difícil de mantener, más difícil de migrar a un nuevo sistema (ya que es muy fácil pasarlo por alto)Esto mejora la respuesta de @Michael Gendin. Su respuesta muestra la página idéntica con dos URL separadas. Sería mejor tener
login
la redirección automáticalogin/
y luego servir esta última como la 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"), )
fuente
pattern_name
argumento que se usaredirect
junto con todos los argumentos de URL que coinciden.Yo también tuve el mismo problema. Mi solución fue poner un (| /) antes de la línea final de mi expresión regular.
url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),
fuente
Agregue una barra sin redireccionar , úsela en lugar de CommonMiddleware en la configuración, Django 2.1:
MIDDLEWARE = [ ... # 'django.middleware.common.CommonMiddleware', 'htx.middleware.CommonMiddlewareAppendSlashWithoutRedirect', ... ]
Agregue a su directorio principal de aplicaciones 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
fuente
Tuve el mismo problema. En mi caso, era un sobrante obsoleto de alguna versión anterior en urls.py, de antes de staticfiles:
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 'django.views.static.serve', kwargs={'document_root': settings.MEDIA_ROOT}),
MEDIA_URL estaba vacío, por lo que este patrón coincidía con todo.
fuente