Django:handler403不起作用,但404无法起作用

时间:2019-01-22 08:44:23

标签: python django server http-status-code-403

以下是 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!

3 个答案:

答案 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