以下是 MyProj / urls.py 的内容:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('general.urls')), # Main app
]
handler403 = 'general.views.handler403'
handler404 = 'general.views.handler403'
如您所见,两个处理程序都指向同一视图,而我最需要的第一个视图不起作用!例如,/obj/12
处其他用户的数据显示默认浏览器403页面:
[22 / Jan / 2019 08:39:14]“ GET / obj / 12 HTTP / 1.1” 403 0
但是第二个效果很好,并且显示正确的页面(当尝试访问/obj/768
上一些不存在的数据时)。为什么以及如何解决?
调试模式已关闭。我的Django版本是2.0.6
更新。
handler403.py 文件的内容:
from django.shortcuts import render_to_response
def handler403(request, *args, **argv):
print('Handler 403 was called!')
u = request.user
params = {
'user': u,
}
response = render_to_response('403.html', params)
response.status_code = 403
return response
当我尝试获取此页面时,永远不会打印字符串Handler 403 was called!
。
答案 0 :(得分:3)
我的猜测是您的视图将返回django.http.HttpResponseForbidden
而不是引发django.core.exceptions.PermissionDenied
异常。
只有PermissionDenied
异常由处理程序403处理,HttpResponseForbidden
照原样返回。
答案 1 :(得分:1)
如果这确实是您的处理程序403 文件(又名handler403.py
),您可能想要
handler403 = 'general.views.handler403.handler403'
(因此是实际可调用项的虚线路径)。
答案 2 :(得分:0)
handler403应该指向一个视图
尝试这样的事情:
from general.views.handler403 import handler403
handler403 = handler403