django自定义错误响应
在做一个web时,总是会出现各种错误,如400、403、404、500等。一般开发都要做对应的处理,给一些友好提示,或返回一些公益广告等。
在Django中,默认提供了常见的错误处理方式,比如:
handler404 = 'polls.views.my_custom_page_not_found_view' handler500 = 'polls.views.my_custom_error_view' handler403 = 'polls.views.my_custom_permission_denied_view' handler400 = 'polls.views.my_custom_bad_request_view'
handler*名称都是固定的,不能随意更改,Django已经约定好的,不同的状态码对应不同的错误。另外这些配置都需要写入到项目入口的urls.py文件中,不能写入到应用的urls.py文件中,不然不会生效。对于值需要引入写好的视图函数,写绝对路径。
为什么写入应用urls.py文件不生效呢?因为当程序抛出Http404异常时,Django会加载一个特殊的view方法处理404错误。默认地, 它是django.views.defaults.page_not_found,负责加载和渲染404.html模板文件。这意味着我们必须在模板根目录定义404.html模板文件,该模板文件应用于所有的404异常。
下面我们定义一个404异常的处理。
首先在根urlconf中配置handler404处理逻辑如下:
handler404 = "mysite.views.page_not_found" #mysite是app名字,views是app下面的views.py文件,后面的page_not_found表示视图函数名字
#注意:一定是根urlconf中。
然后再对应的app下面定义函数,上面是在mysite这个app下面定义的views.py中。
from django.http import HttpResponseNotFound def page_not_found(request): return HttpResponseNotFound("Fucking!")
然后需要关闭django的debug模式,并且需要定义ALLOWED_HOSTS选项。
DEBUG = False ALLOWED_HOSTS = ["*"]
然后启动django,访问一个不存在的页面。
[root@test2 ~]# curl 172.16.100.19:80/werwer/ Fucking!
这里我们只返回了一个字符串,自然也可以返回一个完整的html页面。