Flask中自定义异常对象

1. 处理多客户端登录注册

当存在多种类型的客户端的时候,我们就要编写多个验证Form,这时候继承是最好的选择。

对于api接口来说,一般传的数据格式都是json格式。这时我们要验证数据的时候,验证方式为

1
2
3
4
5
6
data = request.json
# 这里相比于通过form提交 需要制定data参数
form = someForm(data=data)

if for.validate():
pass

REST细节特性:输入输出都需要是json格式的

这里说的json格式不仅是数据返回的时候,还包括报错和提醒。

只有我们考虑编码的细节和逻辑,我们的编码能力才能提高!

2. 自定义异常对象

我们之前知道很多异常对象和状态码绑定,但是我们想要实现自己的异常对象应该如何实现呢?

我们看一下一些状态码的含义:

  1. 400 请求参数有误
  2. 401 未授权
  3. 403 禁止访问
  4. 404 没有找到
  5. 500 服务器报错
  6. 200 查询成功
  7. 201 创建更新成功
  8. 204 删除成功
  9. 301 重定向

默认情况下的异常返回都是HTML格式的,为什呢?看下源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@implements_to_string
class HTTPException(Exception):

def get_body(self, environ=None):
"""Get the HTML body."""
return text_type((
u'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n'
u'<title>%(code)s %(name)s</title>\n'
u'<h1>%(name)s</h1>\n'
u'%(description)s\n'
) % {
'code': self.code,
'name': escape(self.name),
'description': self.get_description(environ)
})

def get_headers(self, environ=None):
"""Get a list of headers."""
return [('Content-Type', 'text/html')]

正是上面两个方法指定了默认返回值都是网页的方式。

我们可以通过重写上面这些方法来将返回值变成json格式。

我们编写一个异常类APIException继承HTTPException来作为异常基类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from flask import request, json
from werkzeug.exceptions import HTTPException


class APIException(HTTPException):
code = 500
msg = 'sorry, we made a mistake (* ̄︶ ̄)!'
error_code = 999

def __init__(self, msg=None, code=None, error_code=None,
headers=None):
if code:
self.code = code
if error_code:
self.error_code = error_code
if msg:
self.msg = msg
# 调用一下父类的初始化函数
super(APIException, self).__init__(msg, None)

# 这个函数指定返回内容
def get_body(self, environ=None):
body = dict(
msg=self.msg,
error_code=self.error_code,
# 这里返回的是请求的方法和url 例如: post /some/url
request=request.method + ' ' + self.get_url_no_param()
)
text = json.dumps(body)
# 返回json格式
return text

# 这个函数指定返回格式
def get_headers(self, environ=None):
"""Get a list of headers."""
# 真的想返回json格式数据 需要制定为 application/json
return [('Content-Type', 'application/json')]

@staticmethod
def get_url_no_param():
# 用于解析请求 获得请求的url
full_path = str(request.full_path)
main_path = full_path.split('?')
return main_path[0]

完成基类创建后,我们就可以创建很多自己定义的异常类了。

1
2
3
4
class ClientTypeError(APIException):
code = 400
msg = 'client is invalid'
error_code = 1006

定义好之后就可以直接返回或者抛出

1
2
3
raise ClientTypeError()

return ClientTypeError()
知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!