Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

本篇是给使用了flask_restful的视图加装饰器,如果您想要看的不是这种内容,建议访问官方文档视图装饰器

本篇博客参考了Flask-RESTful中装饰器的使用-dnsir的博客,感谢博主分享知识。

这里我使用的是JWT加密,一看就懂,那么我直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Jwt权限校验
def post_jwt_isvalid(func):
@wraps(func)
def inner(*args, **kwargs):

try:
jwt_token = request.form['token']
jwt_decode(jwt_token)
return func(*args, **kwargs)
except Exception:
return {
'code': 401,
'msg': '您的登录已过期,请重新登录'
}

return inner

就是类似这样的一个格式。
装饰器已经定义完了,那么下面的就是使用了,使用也很简单,直接看代码就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Register(Resource):
method_decorators = {'post': [post_jwt_isvalid]}
def post(self):
name = request.form['username']
password = request.form['password']
uname_pwd_isvalid(name, password)
arg = (name, password)
sql = 'insert into user (username, password)values(%s, %s)'

try:
cur.execute(sql, arg)
coon.commit()
return {
'code': 200,
'msg': '注册成功'
}
except pymysql.IntegrityError:
return {
'code': 403,
'msg': '注册失败,已有相同用户名'
}

这样装饰器就能正常运行了。请忽略我把权限验证加在注册这一点上,我只是为了演示。
无需担心会报错,在2020/07/19:49时,python3.8.5,Flask1.1.2,Flask-RESTful0.3.8下,实测可以正常运行。

使用abort方便的返回响应并终止视图

在看官方文档的时候,突然看到名为Full Example标题下的内容里有一个abort方法,看着官方文档的演示,我感觉自己发现了好东西。
abort可以应用在很多场景,比如在函数中进行密码或用户名的校验,如果用户名或密码错误,需要返回响应,不用返回字符串和状态码到视图,再由视图函数判断状态码是否正确,然后return终结函数 这么麻烦,abort能够直接在函数中终止视图的运行。
那么下面是我自己定义的一个相当简陋的用户名密码过滤器:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 帐号密码判断
def uname_pwd_isvalid(name, password):
if name == '' or not name:
# abort(jsonify({'code': 400, 'msg': '用户名不能为空'}))
abort({'code': 403, 'msg': '用户名不能为空'})
if name == 'null':
abort({'code': 403, 'msg': '用户名含有敏感词汇'})
if password == 'null':
abort({'code': 403, 'msg': '密码含有敏感词汇'})
if password == '' or not password:
abort({'code': 403, 'msg': '密码不能为空'})


请不要在意它有多么的简陋,这里放出它的目的只是演示。
然后调用(这里只给出代码片段):

1
2
3
4
5
6
class Login(Resource):

def post(self):
username = request.form.get('name')
password = request.form.get('password')
uname_pwd_isvalid(username, password)

然后访问这个视图:

1
2
3
4
5
curl http://127.0.0.1:5000/login -d 'name=null' -d 'password=1111111'
{
"code": 403,
"msg": "用户名含有敏感词汇"
}

可以看到,这里的响应是由abort()传出的。

评论



愿火焰指引你