惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
月光博客
月光博客
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
IT之家
IT之家
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
S
SegmentFault 最新的问题
宝玉的分享
宝玉的分享
博客园 - Franky
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
爱范儿
爱范儿

博客园 - 半岛拖鞋

Linux下手动安装部署MySQL8.4 定位informix oninit进程CPU占用过高的一般步骤 使用Eclipse Memory Analyzer分析java程序占用内存的情况 解决C#连接informix数据库中文乱码 Python手动新建环境 @ApiImplicitParam DataType参数的数据类型 C# Odbc Informix读取中文方法 eclise国内镜像下载地址 Spring Initializr - LSP - Failed to fetch Generation from Spring IO: port out of range: -1 oracle express 18安装后初次登录 linux 查找并批量kill进程 从WebService的SOAP返回数据中获取子级的XML内容 C# 进行用(反)序列化方法实现xml与对象进行互相转换 Alpine Linux添加中文支持显示 VBS字符串在不同编码之间的转换 C#根据wsdl文件生成客户端调用代码 PHP 7.4 checking for libzip 和 failed to open error_log 问题 PHP连接Informix异常 CentOS安装扩展软件支持库
Flask JWT简单但完整的项目部署
半岛拖鞋 · 2026-03-16 · via 博客园 - 半岛拖鞋

环境:

Python 3.10

开发工具: pycharm 免费版

项目目录结构如下:

764be738-de4a-4dec-a1f0-3c97d813ef92

 源代码及其功能

run.py 程序启动文件, test.py源代码测试功能, config.py项目配置文件.

app.__init__.py  入口程序启动文件,  app.routes.__init__.py 路由统一引入文件, app.routes.jwt.py  JWT登录,验证实例文件

相关文件看附件: https://gitee.com/schrodinger/flask_jwt.git

源码简单说明:

jwt.py

from flask import Blueprint, request, jsonify
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity,get_jwt

bp = Blueprint('jwt', __name__)

@bp.route('/get')
@jwt_required()
def get():
    username = get_jwt_identity()
    additional_claims = get_jwt()
    data = {"claims":additional_claims,"username":username}
    resp = {"status":0,"success":True,"message":"OK","data":data}
    return jsonify(resp)

@bp.route('/login',methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')

    data = {"status":-1,"success":False,"message":"Not defined","token":""}

    if username is None or len(username) == 0:
        data["message"] = "username is required"
        return jsonify(data)
    if password is None or len(password) == 0:
        data["message"] = "password is required"
        return jsonify(data)
    if username == "admin" and password == "admin888":
        data["status"] = 0
        data["message"] = "OK"
        data["success"] = True

        additional_claims = {"role":"admin","uid":1}

        data["token"] = create_access_token(identity=username,additional_claims=additional_claims)
        return jsonify(data)
    else:
        data["message"] = "用户名或密码错误"

    return jsonify(data)

  以上的def get(): 函数上的 @jwt_required() , 要记得保留括号

项目启动(python run.py) 后通过 POST数据获取jwt tokon:

curl -X POST -H "Content-Type: application/json" -d "{\"username\":\"admin\",\"password\":\"admin888\"}" http://127.0.0.1:5000/jwt/login 

返回的数据大概如下:

1 {
2   "message": "OK",
3   "status": 0,
4   "success": true,
5   "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTc3MzYyNzcwMSwianRpIjoiNmU0MzhjNDItNzE0Yy00MGEwLTljYjYtZTIzZDViMGU4YTI2IiwidHlwZSI6ImFjY2VzcyIsInN1YiI6ImFkbWluIiwibmJmIjoxNzczNjI3NzAxLCJjc3JmIjoiNmFlMjQ0NWYtOWE2NS00Y2QwLTgyZTctYWQxYjkwNzRjN2E1IiwiZXhwIjoxNzczNjI5NTAxLCJyb2xlIjoiYWRtaW4iLCJ1aWQiOjF9.aqMYxwx8Qx5mUIDcWSxVWuJiO2Nb4_oVgyvehcGdaa8"
6 }

接下来复制token值进行访问验证:

curl -X GET -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmcmVzaCI6ZmFsc2UsImlhdCI6MTc3MzYyNjUwNiwianRpIjoiY2M0ZDhmZmUtNGQyMS00NWRkLWJjZDMtZmI0ZGNiYTRlYzJiIiwidHlwZSI6ImFjY2VzcyIsInN1YiI6ImFkbWluIiwibmJmIjoxNzczNjI2NTA2LCJjc3JmIjoiZjQwNDFmZTQtMmQ2MS00ZWI0LWI5YzQtYWFiYjI2OTczZGY2IiwiZXhwIjoxNzczNjI4MzA2LCJyb2xlIjoiYWRtaW4iLCJ1aWQiOjF9.ibCwVR_eqP-Al-0CdWQeyHmjKGw2aQDWDe_ODUjf_mY" http://127.0.0.1:5000/jwt/get

返回的结构大概如下:

{
  "data": {
    "claims": {
      "csrf": "f4041fe4-2d61-4eb4-b9c4-aabb26973df6",
      "exp": 1773628306,
      "fresh": false,
      "iat": 1773626506,
      "jti": "cc4d8ffe-4d21-45dd-bcd3-fb4dcba4ec2b",
      "nbf": 1773626506,
      "role": "admin",
      "sub": "admin",
      "type": "access",
      "uid": 1
    },
    "username": "admin"
  },
  "message": "OK",
  "status": 0,
  "success": true
}