Saya punya dua aplikasi yang terletak di dua komputer terpisah. Di komputer A, di urls.py
file saya memiliki baris seperti berikut:
(r'^cast/$', 'mySite.simulate.views.cast')
Dan url itu akan berfungsi untuk mySite.com/cast/
dan mySite.com/cast
. Tetapi di komputer BI memiliki url serupa yang ditulis seperti:
(r'^login/$', 'mySite.myUser.views.login')
Untuk beberapa alasan di komputer B url mySite.com/login
/ akan berfungsi tetapi mySite.com/login
akan hang dan tidak langsung kembali mySite.com/login/
seperti pada komputer A. Apakah ada sesuatu yang saya lewatkan? Kedua url.py
file terlihat identik dengan saya.
python
django
django-urls
apa apa
sumber
sumber
Atau Anda dapat menulis url Anda seperti ini:
(r'^login/?$', 'mySite.myUser.views.login')
Tanda tanya setelah garis miring membuatnya opsional di regexp. Gunakan jika karena alasan tertentu Anda tidak ingin menggunakan setelan APPEND_SLASH.
sumber
APPEND_SLASH
, jika mereka secara tidak sengaja mengirimnya tanpa garis miring, dan urlconf Anda DENGAN garis miring, mereka akan mendapatkan pengecualian tentang kehilangan data saat mengarahkan permintaan POST./
) - ceroboh, buruk untuk crawler, lebih sulit untuk dipertahankan, lebih sulit untuk bermigrasi ke sistem baru (karena sangat mudah untuk diabaikan)Ini meningkatkan jawaban @Michael Gendin. Jawabannya menyajikan halaman yang identik dengan dua URL terpisah. Akan lebih baik jika
login
mengalihkan secara otomatis kelogin/
, dan kemudian menyajikan yang terakhir sebagai halaman utama: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"), )
sumber
pattern_name
arg yang digunakanredirect
bersama dengan semua url arg yang cocok.Saya juga mengalami masalah yang sama. Solusi saya meletakkan (| /) sebelum garis akhir ekspresi reguler saya.
url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),
sumber
Tambahkan garis miring tanpa pengalihan , gunakan itu sebagai ganti CommonMiddleware dalam pengaturan, Django 2.1:
MIDDLEWARE = [ ... # 'django.middleware.common.CommonMiddleware', 'htx.middleware.CommonMiddlewareAppendSlashWithoutRedirect', ... ]
Tambahkan ke direktori aplikasi utama Anda 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
sumber
Saya punya masalah yang sama. Dalam kasus saya, itu adalah sisa basi dari beberapa versi lama di urls.py, dari sebelum staticfiles:
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'), 'django.views.static.serve', kwargs={'document_root': settings.MEDIA_ROOT}),
MEDIA_URL kosong, jadi pola ini cocok dengan semuanya.
sumber