J'ai deux applications situées sur deux ordinateurs distincts. Sur l'ordinateur A, dans le urls.py
fichier, j'ai une ligne comme la suivante:
(r'^cast/$', 'mySite.simulate.views.cast')
Et cette URL fonctionnera à la fois pour mySite.com/cast/
et mySite.com/cast
. Mais sur l'ordinateur, BI a une URL similaire écrite comme:
(r'^login/$', 'mySite.myUser.views.login')
Pour une raison quelconque sur l'ordinateur B, le url mySite.com/login
/ fonctionnera mais mySite.com/login
se bloquera et ne reviendra pas mySite.com/login/
comme il le fera sur l'ordinateur A. Y a-t-il quelque chose que j'ai manqué? Les deux url.py
fichiers me semblent identiques.
python
django
django-urls
quoi quoi
la source
la source
Ou vous pouvez écrire vos URL comme ceci:
(r'^login/?$', 'mySite.myUser.views.login')
Le signe de question après la barre oblique finale le rend facultatif dans l'expression rationnelle. Utilisez-le si, pour certaines raisons, vous ne souhaitez pas utiliser le paramètre APPEND_SLASH.
la source
APPEND_SLASH
, s'ils l'ont envoyé accidentellement sans barre oblique de fin, et que votre urlconf est AVEC une barre oblique de fin, ils recevraient une exception concernant la perte de données lors de la redirection des requêtes POST./
) - bâclée, mauvaise pour les robots d'exploration, plus difficile à maintenir, plus difficile à migrer vers un nouveau système (car il est si facile à négliger)Cela améliore la réponse de @Michael Gendin. Sa réponse sert la même page avec deux URL distinctes. Il vaudrait mieux avoir
login
automatiquement redirigé verslogin/
, puis servir ce dernier comme page principale: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"), )
la source
pattern_name
argument qui est utiliséredirect
avec tous les arguments d' url qui correspondent.J'ai eu le même problème aussi. Ma solution a été placée un (| /) avant la dernière ligne de mon expression régulière.
url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),
la source
Ajoutez une barre oblique sans redirection , utilisez-la à la place de CommonMiddleware dans les paramètres, Django 2.1:
MIDDLEWARE = [ ... # 'django.middleware.common.CommonMiddleware', 'htx.middleware.CommonMiddlewareAppendSlashWithoutRedirect', ... ]
Ajoutez à votre répertoire d'applications principal 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
la source
J'ai eu le même problème. Dans mon cas, c'était un reste périmé d'une ancienne version de urls.py, d'avant staticfiles:
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 'django.views.static.serve', kwargs={'document_root': settings.MEDIA_ROOT}),
MEDIA_URL était vide, donc ce modèle correspondait à tout.
la source