python+flask_restful使用jwt
正在做毕设,由于毕设需求使用python+flask,使用jwt目的是对请求进行保护,我的项目采用vue3+flask前后端分离实现,进入正题:
使用jwt,首先下载扩展
pip install Flask-JWT-Extended
然后在项目中注册使用,我的项目结构是这样的
在exts.py中引入jwt扩展,
from flask_jwt_extended import create_access_token,get_jwt_identity,jwt_required,JWTManager jwt = JWTManager() def init_ext(app): jwt.init_app(app)
在__init__.py中设置密钥
app.config["JWT_SECRET_KEY"] = "super-secret" # 初始化插件扩展 init_ext(app)
apis.py 中用来写方法,urls中用来写路由,方便前端使用
apis.py中的登录
class Login(Resource): @marshal_with(login_fields) def post(self): data = request.get_json() email = data.get('email') password = data.get('password') u = User.query.filter_by(email=email).first() access_token = create_access_token(identity=email) if password == u.password: return { "code":200, "msg":"success", "data":u, "token":access_token #登录成功会返回token } else: return { "code":201, "msg":"fail" }
使用ApiPost进行测试
完成之后,在另一请求上获取token,参数名为Authorization
class UserResource(Resource): method_decorators = [jwt_required()] @marshal_with(res_fields) def get(self): current_user = get_jwt_identity() if current_user is None: return jsonify("Not Authorized"),401 curr_page = int(request.args.get('curr_page', 1)) page_size = int(request.args.get('page_size', 5)) name = request.args.get('name',None) p = User.query.filter(User.name.like('%' + name + '%')).paginate(page=curr_page, per_page=page_size) return { 'code': 200, 'msg': 'success', 'data': p.items, 'curr_page': p.page, 'page_size': p.per_page, 'total': p.total }
再次进行测试,
不携带token会出现
携带token会出现
这时需要在Authorization的参数值前方加入"Bearer "
参考文章:flask实战