第七章 自定义装饰器

您可以创建自己的decorator来扩展此扩展所提供的decorator的功能。例如,您可能希望创建自己的decorator来验证JWT的存在,并验证此令牌具有足够的权限/角色来访问端点。在请求中验证令牌是一个函数列表,可以用来构建您自己的装饰器(这些也是这个扩展提供的所有默认装饰器在内部使用的)。
下面是一个例子。

from functools import wraps

from flask import Flask, jsonify, request
from flask_jwt_extended import (
    JWTManager, verify_jwt_in_request, create_access_token,
    get_jwt_claims
)

app = Flask(__name__)

app.config['JWT_SECRET_KEY'] = 'super-secret'  # Change this!
jwt = JWTManager(app)



# Here is a custom decorator that verifies the JWT is present in
# the request, as well as insuring that this user has a role of
# `admin` in the access token
def admin_required(fn):
    @wraps(fn)
    def wrapper(*args, **kwargs):
        verify_jwt_in_request()
        claims = get_jwt_claims()
        if claims['roles'] != 'admin':
            return jsonify(msg='Admins only!'), 403
        else:
            return fn(*args, **kwargs)
    return wrapper


@jwt.user_claims_loader
def add_claims_to_access_token(identity):
    if identity == 'admin':
        return {'roles': 'admin'}
    else:
        return {'roles': 'peasant'}


@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username', None)
    access_token = create_access_token(username)
    return jsonify(access_token=access_token)


@app.route('/protected', methods=['GET'])
@admin_required
def protected():
    return jsonify(secret_message="go banana!") 

if __name__ == '__main__':
    app.run()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 快速开始 在安装Sanic之前,让我们一起来看看Python在支持异步的过程中,都经历了哪些比较重大的更新。 首先...
    hugoren阅读 19,757评论 0 23
  • 要加“m”说明是MB,否则就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms8...
    dadong0505阅读 4,941评论 0 53
  • 在这篇文章中,我将分享一些关于JWT令牌的知识。具体来说,我将讨论JWT的结构,以及如何通过验证签名来信任令牌中的...
    开心人开发世界阅读 1,004评论 0 2
  • 正因为知道谁的人生都差不多平凡,所以,更会珍惜每一次扑腾的机会,来这世界一趟,总得看看太阳。
    鲸鱼77阅读 282评论 0 1
  • (图片来源于网络庆余年剧照) 在腾讯视频和爱奇艺播出的电视剧《庆余年》最近大火,不仅因为男频“爽剧”(以男性视角为...
    贰两儿烧酒阅读 375评论 0 0