【Flask】abort和errorhandler、app_errorhandler进行请求中断及自定义异常处理

在view函数中,如果需要中断request,可以使用abort(500)或者直接raise exception。当然我们还需要返回一个出错信息给前端,所以需要定制一下ErrorHandler。一般只需要两个个handler即可,一个是404错误,一个是500一类的服务器端错误。当然也可以自定义错误。

abort中断请求

# 在flask中可以通过abort中断触发请求对应的状态码
from flask import  abort

@app.route('/')
def index():
    abort(401)    # 请求到此即中断,不会打印下面的语句,并返回HTTP状态码401
   print '123' 

errorhandler捕捉当前app或蓝图的状态码,并进行自定制处理

下面是一份示例代码,admin是一个蓝本或者app,发生404错误或500错误,会返回一个Json对象给请求段。

from flask import jsonify
from . import admin

@admin.errorhandler(404)
def error_404(error):
    """这个handler可以catch住所有abort(404)以及找不到对应router的处理请求"""
    response = dict(status=0, message="404 Not Found")
    return jsonify(response), 404

@admin.errorhandler(Exception)
def error_500(error):
    """这个handler可以catch住所有的abort(500)和raise exeception."""
    response = dict(status=0, message="500 Error")
    return jsonify(response), 400

class MyError(Exception):
    """自定义错误类"""
    pass

@admin.errorhandler(MyError)
def MyErrorHandle(error):
    response = dict(status=0, message="400 Error")
    return jsonify(response), 400

app_errorhandler捕捉全局状态码,并进行自定制异常处理

在蓝本中编写错误处理程序有点不同,如果使用errorhandler修饰器,那么只有蓝本中的错误才会触发。如果想注册全局的错误处理程序,要用app_errorhandler

例如:

from . import auth


@auth.app_errorhandler(404)
def error_404(error):
    response = dict(status=0, message="404 Not Found")
    return jsonify(response), 404

补充说明

  当我们不是使用的工厂模式创建app时,app.errorhandler(401),即可捕捉全局401状态;若使用了create_app方式创建app,则无法进行捕捉,若想捕捉,可以在蓝图中写,如admin.errorhandler(401),即捕捉admin蓝图下所有401状态码,admin.app_errorhandler(401),则是捕捉的全局的401状态码,即其他蓝图中的401状态,也会被捕捉,进行处理

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏崔庆才的专栏

爬虫速度太慢?来试试用异步协程提速吧!

在执行一些 IO 密集型任务的时候,程序常常会因为等待 IO 而阻塞。比如在网络爬虫中,如果我们使用 requests 库来进行请求的话,如果网站响应速度过慢,...

2540
来自专栏Albert陈凯

Storm Trident State 三种事务

原文链接 译者:魏勇 Trident 中含有对状态化(stateful)的数据源进行读取和写入操作的一级抽象封装工具。这个所谓的状态(state)既可以保...

3366
来自专栏JAVA烂猪皮

JAVA多线程与并发学习总结

使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行;当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存...

491
来自专栏xcywt

《Linux命令行与shell脚本编程大全》第十一章 构建基本脚本

11.1使用多个命令 $date;who   //  命令列表,加入分号就可以,这样会依次执行。参见5.2.1节 注意区分$(date;who),这个是进程列表...

1907
来自专栏北京马哥教育

Linux自动化运维工具之ansible(二)

糖豆贴心提醒,本文阅读时间8分钟 YAML简介 YAML是一个可读性高的用来表达资料序列的格式。 YAML参考了其他多种语言,包括:XML、C语言、Pytho...

2646
来自专栏思考的代码世界

Python基础学习09天

1506
来自专栏C/C++基础

Linux命令(1)——xargs命令

xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令。因为以空格作为分隔符,所以有一些文件名或者...

963
来自专栏北京马哥教育

138 条 Vim 命令、操作、快捷键全集

1416
来自专栏轻量级微服务

微服务下跨语言 RPC 实现

目前主流的 Java 开发框架 Spring Boot,为了更方便集成 gRPC,自己开发了 spring-boot-starter-grpc,仅需简单的几行配...

1443
来自专栏指尖下的Android

JNI之路径初探---3

这里讲一下如何拿到类中方法和属性的签名: 1,cmd进入命令行 2,cd 命令切到当前项目的src路径 3,javap -s -p 包名+类名(xxx.x...

863

扫码关注云+社区