本篇是给使用了flask_restful的视图加装饰器,如果您想要看的不是这种内容,建议访问官方文档视图装饰器。
本篇博客参考了Flask-RESTful中装饰器的使用-dnsir的博客,感谢博主分享知识。
这里我使用的是JWT加密,一看就懂,那么我直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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({'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()传出的。