我有一个像下面这样的自定义中间件:
class PageNotFoundMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
sura_pattern = r"/sura/[1-9]\d*-[1-9]\d*/$"
print(f'\n\n{request.path_info}: {response.status_code}\n\n') # <--
if response.status_code == 404:
if re.match(sura_pattern, request.path_info):
return response
return render(request, '404.html')
elif response.status_code == 400:
return render(request, '400.html')
elif response.status_code == 500:
return render(request, '500.html')
elif response.status_code == 200 or response.status_code == 301:
return response
在我用箭头标记的行中:“<--", the
request.path_ifo
,没有结尾“/”。
如果inputted url是:
/sura/10
,那么它会显示/sura/10
,但它必须附加并以“/”结尾。这个网址是有效的,这是urls.py
:
urlpatterns = [
path("", home, name="home"),
path('sura/<int:sura>/', sura_handler, name='sura_handler'), # <-- path which should get the url
path('sura/<str:sura_aya>/', index, name='index'),
path('page/<str:page>/', page_handler, name='page_handler'),
path('juz/<str:juz>/', juz_handler, name='juz_handler'),
path('api/', include('quran.api.urls')),
path('sw/', sw, name="sw"),
path('manifest/', manifest, name="manifest"),
]
在执行正则表达式之前,
response.status_code
是 404
。
如果我正确输入了 url,(像这样:/sura/10/
)那么 response.status_code
in not 404
.
有人可以帮我找出为什么 CommonMiddleware 在自定义中间件中不起作用吗?
django 中的中间件:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'quran.middleware.PageNotFoundMiddleware' # <-- custom middleware
]
django version: 4.2
我刚刚发现
CommonMiddleware
在django的自定义中间件中不起作用。
django version: 4.2