You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-JWT-Extended如何仅对同一路由指定请求方法做JWT鉴权

解决方案

无需拆分GET路由,仅需调整JWT校验的触发位置即可实现需求。
你当前的实现问题在于将@jwt_required()直接装饰在整个路由视图上,所有请求方法进入视图前都会被强制校验JWT,只要将全局装饰器校验改为视图内按请求方法分支校验即可。

基础实现(针对单路由)

Flask-JWT-Extended扩展提供了手动校验JWT的方法verify_jwt_in_request(),修改后的代码如下:

from flask import request
from flask_jwt_extended import verify_jwt_in_request

# 移除全局的@jwt_required()装饰器
@general_api.route("/user_types", methods=["GET", "POST", "PUT", "DELETE"])
def user_types_crud():
    # 仅非GET请求触发JWT校验,校验失败会自动返回对应错误响应
    if request.method != "GET":
        verify_jwt_in_request()
    
    instance = ConstantsRoutes(UserTypes, "type")
    return crud_routes(request, instance)

批量路由适配方案

如果你有多个同逻辑的通用常量路由(比如/api/general/dlc_types),可以封装自定义装饰器统一处理鉴权逻辑,避免重复代码:

from functools import wraps
from flask import request
from flask_jwt_extended import verify_jwt_in_request

def jwt_required_for_write():
    """GET请求放行,其余写操作请求校验JWT"""
    def wrapper(view_func):
        @wraps(view_func)
        def decorated(*args, **kwargs):
            if request.method in ["POST", "PUT", "DELETE"]:
                verify_jwt_in_request()
            return view_func(*args, **kwargs)
        return decorated
    return wrapper

所有同类CRUD路由直接复用该装饰器即可,不需要改动原有业务分发逻辑:

# 多个同规则路由可以统一挂载装饰器
@general_api.route("/user_types", methods=["GET", "POST", "PUT", "DELETE"])
@general_api.route("/dlc_types", methods=["GET", "POST", "PUT", "DELETE"])
@jwt_required_for_write()
def general_const_crud():
    # 原有模型匹配、CRUD分发逻辑保持不变即可
    model_map = {
        "user_types": UserTypes,
        "dlc_types": DlcTypes
    }
    # 按请求路径匹配对应模型即可,可根据你现有代码结构调整
    current_model = model_map[request.path.strip("/").split("/")[-1]]
    instance = ConstantsRoutes(current_model, "type")
    return crud_routes(request, instance)

方案说明

  • verify_jwt_in_request()的校验逻辑和@jwt_required()装饰器完全一致,token缺失、过期、签名非法时会自动触发你项目中已配置的JWT错误处理逻辑,无需额外编写异常捕获代码
  • 整个方案完全保留了你原有同路由按请求方法分发CRUD逻辑的设计,不需要拆分路由、不需要修改ConstantsRoutes和crud_routes的核心业务代码
  • 后续如果需要调整鉴权规则(比如给部分GET接口加鉴权、给特定写操作开白名单),只需要修改装饰器内的判断逻辑即可,维护成本很低

内容的提问来源于stack exchange,提问作者Dimitar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:21:33