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

Posted

技术标签:

【中文标题】Django:handler403 不起作用,但 404 起作用【英文标题】:Django: handler403 doesn't work, but 404 does 【发布时间】:2019-06-15 16:34:05 【问题描述】:

这是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!

【问题讨论】:

您可以使用自定义错误处理程序视图更新您的问题吗? @MohammadUmair 完成。 【参考方案1】:

我的猜测是您的视图返回 django.http.HttpResponseForbidden 而不是引发 django.core.exceptions.PermissionDenied 异常。

只有PermissionDenied 异常被handler403 处理,HttpResponseForbidden 原样返回。

【讨论】:

确实!非常感谢:)【参考方案2】:

如果那真的是你的 handler403 文件(又名。handler403.py),你可能会想要

handler403 = 'general.views.handler403.handler403'

(因此是实际可调用对象的虚线路径)。

【讨论】:

不,它没有帮助,我已经尝试以不同的方式指定路径。另外,准确地说,handler403 存储在general.view.handler403 中,而general.view.__init__ 具有from .handler403 import handler403 你可能想在你的本地副本django.urls.resolvers.URLResolver#resolve_error_handler 中加入一些调试工具(即prints),看看它在做什么。【参考方案3】:

handler403 应该指向一个视图

试试这样的:

from general.views.handler403 import handler403

handler403 = handler403

【讨论】:

以上是关于Django:handler403 不起作用,但 404 起作用的主要内容,如果未能解决你的问题,请参考以下文章

Django ajax GET 403(禁止)

iOS 应用上的 Youtube API v3。我的 API 密钥不起作用,但其他人的密钥在同一个应用程序上工作。错误 403

403重定向不起作用

剃须刀页面 asp-page-handler 按钮不起作用

弹簧安全返回 403,日志记录不起作用

CORS 在 Django 中不起作用,但设置似乎正确