Mam dwie aplikacje umieszczone na dwóch oddzielnych komputerach. Na komputerze A w urls.py
pliku mam wiersz podobny do następującego:
(r'^cast/$', 'mySite.simulate.views.cast')
Ten adres URL będzie działać zarówno w przypadku, jak mySite.com/cast/
i mySite.com/cast
. Ale na komputerze BI mają podobny adres URL zapisany na przykład:
(r'^login/$', 'mySite.myUser.views.login')
Z jakiegoś powodu na komputerze B url mySite.com/login
/ będzie działał, ale mySite.com/login
będzie się zawieszał i nie przekieruje z powrotem do mySite.com/login/
takiego, jak na komputerze A. Czy jest coś, co przegapiłem? Oba url.py
pliki wyglądają identycznie jak ja.
python
django
django-urls
co co
źródło
źródło
Lub możesz napisać swoje adresy URL w ten sposób:
(r'^login/?$', 'mySite.myUser.views.login')
Znak zapytania po końcowym ukośniku sprawia, że jest on opcjonalny w wyrażeniu regularnym. Użyj go, jeśli z jakichś powodów nie chcesz używać ustawienia APPEND_SLASH.
źródło
APPEND_SLASH
, jeśli przypadkowo wysłali go bez końcowego ukośnika, a twój urlconf jest Z końcowym ukośnikiem, otrzymaliby wyjątek dotyczący utraty danych podczas przekierowywania żądań POST./
) - niechlujnie, źle dla robotów, trudniejsza w utrzymaniu, trudniejsza do migracji do nowego systemu (ponieważ tak łatwo ją przeoczyć)To poprawia odpowiedź @Michaela Gendina. Jego odpowiedź zawiera identyczną stronę z dwoma oddzielnymi adresami URL. Lepiej byłoby mieć
login
automatyczne przekierowanie dologin/
, a następnie wyświetlać tę ostatnią jako stronę główną: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"), )
źródło
pattern_name
argument, który jest używanyredirect
wraz ze wszystkimi dopasowanymi argumentami adresu URL.Ja też miałem ten sam problem. Moje rozwiązanie zostało wstawione (| /) przed końcową linią wyrażenia regularnego.
url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),
źródło
Dołącz ukośnik bez przekierowania , użyj go zamiast CommonMiddleware w ustawieniach, Django 2.1:
MIDDLEWARE = [ ... # 'django.middleware.common.CommonMiddleware', 'htx.middleware.CommonMiddlewareAppendSlashWithoutRedirect', ... ]
Dodaj do głównego katalogu aplikacji 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
źródło
Miałem ten sam problem. W moim przypadku była to nieaktualna pozostałość po starej wersji w urls.py, sprzed staticfiles:
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 'django.views.static.serve', kwargs={'document_root': settings.MEDIA_ROOT}),
MEDIA_URL był pusty, więc ten wzorzec pasuje do wszystkiego.
źródło