Django:handler403 不起作用,但 404 起作用
Django: handler403 doesn't work, but 404 does
这里是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!
从未打印出来。
如果那真的是你的 handler403 file(又名 handler403.py
),你可能需要
handler403 = 'general.views.handler403.handler403'
(因此是指向实际可调用对象的虚线路径)。
handler403 应该指向一个视图
尝试这样的事情:
from general.views.handler403 import handler403
handler403 = handler403
我猜你的观点 returns 是一个 django.http.HttpResponseForbidden
instead of raising a django.core.exceptions.PermissionDenied
例外。
只有 PermissionDenied
异常被 handler403 处理,HttpResponseForbidden
按原样返回。
这里是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!
从未打印出来。
如果那真的是你的 handler403 file(又名 handler403.py
),你可能需要
handler403 = 'general.views.handler403.handler403'
(因此是指向实际可调用对象的虚线路径)。
handler403 应该指向一个视图
尝试这样的事情:
from general.views.handler403 import handler403
handler403 = handler403
我猜你的观点 returns 是一个 django.http.HttpResponseForbidden
instead of raising a django.core.exceptions.PermissionDenied
例外。
只有 PermissionDenied
异常被 handler403 处理,HttpResponseForbidden
按原样返回。