Flask-JWT-Extended登录验证

1. 介绍 

"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt = JWTManager(app)  # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外,你还可以指定其他的选项,例如:过期时间 (max_age):   指定 cookie 何时过期。# max_age=60 * 60 * 24 * 7  # 7天有效期max_age=datetime.timedelta(days=2)1. 设置cookies# 设置cookies成功 重定向到首页# 创建JWT token,只存储用户名access_token = create_access_token(identity=username)# 设置JWT到cookie并重定向到主页response = redirect(url_for('index'))set_access_cookies(response, access_token,# max_age=60 * 60 * 24 * 7  # 7天有效期max_age=datetime.timedelta(days=2))return response2. 获取cookies# 获取当前会话中的身份信息info = get_jwt_identity()return render_template('index.html', info=info)3. 设置cookies会话有效期max_age=datetime.timedelta(hours=2),  # 设置会话有效期时间# max_age=60 * 60 * 24 * 2,4. 删除cookies# 注销用户并删除JWT cookiesresponse = redirect(url_for('login'))unset_jwt_cookies(response)return response5. response创建对象的方法:导包:from flask import make_response, Response# 1. response = make_response(redirect(url_for('test_blue.login_index')))# 2. response = make_response(render_template('test/home.html'), 200)# 3. response = make_response("success", 201)# 这种就可以# 4. response = redirect(url_for('login'))"""

 

 

 

​​​​​​​ 

2. 验证

''' 验证 '''
'''
# 1. 重新改写这个方法
# def jwt_required(
#         optional: bool = False, fresh: bool = False,
#         refresh: bool = False, locations: Optional[LocationType] = None,
#         verify_type: bool = True, skip_revocation_check: bool = False, ) -> Any:
#     def wrapper(fn):
#         @wraps(fn)
#         def decorator(*args, **kwargs):
#             try:
#                 verify_jwt_in_request(
#                     optional, fresh, refresh, locations, verify_type, skip_revocation_check
#                 )
#                 return current_app.ensure_sync(fn)(*args, **kwargs)
#             except Exception as e:
#                 return redirect(url_for('login'))  # 没有身份信息时重定向到登录页
#
#         return decorator
#
#     return wrapper
#
''''''
2. 这种自定义的可以 重定向
# 自定义auth装饰器来检查JWT身份验证
# def auth(fn):
#     @wraps(fn)
#     def inner(*args, **kwargs):
#         try:
#             verify_jwt_in_request()  # 验证请求中是否存在有效的JWT
#             if not get_jwt_identity():  # 检查JWT中是否有身份信息
#                 return redirect(url_for('login'))  # 没有身份信息时重定向到登录页
#         except Exception as e:
#             print(e)
#             return redirect(url_for('login'))  # 捕获所有异常,重定向到登录页
#         return fn(*args, **kwargs)
#
#     return inner
''''''
# 3. @jwt_required()
#  直接在函数上装饰验证 只会抛异常 不能自动重定向# 4. 自定义auth装饰器来检查JWT身份验证
#  这种的验证 只会抛异常 不能自动重定向
# def auth(fn):
#     @wraps(fn)
#     @jwt_required()
#     def inner(*args, **kwargs):
#         if not get_jwt_identity():  # 检查JWT中是否有身份信息
#             return redirect(url_for('login'))  # 没有身份信息时重定向到登录页
#         return fn(*args, **kwargs)
# 
#     return inner
''''''
# 5. 在前端直接重定向
$.ajax({url: '/protected',method: 'GET',success: function(data) {// 处理成功的响应},error: function(jqXHR) {if (jqXHR.status === 401) {window.location.href = '/login';}}
});''''''
# 6. 设置存储在cookies 不然报错 以下是四种方式   可以都选 单选
app.config['JWT_TOKEN_LOCATION'] = ["cookies"]
# app.config['JWT_TOKEN_LOCATION'] = ["headers", "cookies", "query_string", "json"]'''

 

 

3. 代码


import datetime
import hashlibfrom flask import (Flask, render_template, redirect, url_for, request,session, make_response, Response, current_app
)
from functools import wraps
from flask_jwt_extended import (JWTManager, create_access_token, set_access_cookies,get_jwt_identity, unset_jwt_cookies,jwt_required,verify_jwt_in_request,
)from typing import Optional, Any
from flask_jwt_extended.view_decorators import LocationTypeapp = Flask(__name__)
app.secret_key = "ghakjhkghkahkhgkhalkfdngkasnkglhaj".encode('utf-8')app.config['JWT_TOKEN_LOCATION'] = ["cookies"]jwt = JWTManager(app)  # 初始化JWTManager@app.route('/')
@app.route('/index', methods=["GET", "POST"])
# @auth  # 使用auth装饰器
@jwt_required()
def index():# 获取当前会话中的身份信息info = get_jwt_identity()return render_template('index.html', info=info)@app.route('/login', methods=["GET", "POST"])
def login():if request.method == "POST":username = request.form.get('username', None)password = request.form.get('password', None)confirm_password = request.form.get('confirm_password', None)# 表单验证逻辑if not username or not password or not confirm_password:return render_template('login.html', errors="所有字段不能为空")if password != confirm_password:return render_template('login.html', errors="密码不一致")# 假设用户名和密码验证成功if username == "root" and password == "123":# 创建JWT token,只存储用户名access_token = create_access_token(identity=username)# 设置JWT到cookie并重定向到主页response = redirect(url_for('index'))set_access_cookies(response, access_token,# max_age=60 * 60 * 24 * 7  # 7天有效期max_age=datetime.timedelta(days=2))return responseelse:return render_template('login.html', errors="账号或密码有误")return render_template('login.html')@app.route('/logout', methods=["GET", "POST"])
# @auth
@jwt_required()
def logout():# 注销用户并删除JWT cookiesresponse = redirect(url_for('login'))unset_jwt_cookies(response)return response@app.route('/test')
# @auth
@jwt_required()
def test():return "测试成功"if __name__ == '__main__':app.run(debug=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/426714.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue之 package.json和package-lock.json

一、package.json 定义了当前项目所需要引用的各个模块,可以手工修改配置,也可以删除后,使用npm init命令重新自动生成。 但是该文件只锁定大版本号,也就是版本号的第一位,所以你会发现两个文件中同一个包的版本号不一…

项目实现:云备份②(文件操作、Json等工具类的实现)

云备份 前言文件操作实用工具类设计文件属性的获取文件的读写操作文件压缩与解压缩的实现文件目录操作 Json 实用工具类设计编译优化 前言 如果有老铁不知道当前项目实现的功能是什么的话,可以先移步这篇文章内容: 云备份项目的介绍 其中介绍了云备份项…

[数据集][目标检测]无人机飞鸟检测数据集VOC+YOLO格式6647张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6647 标注数量(xml文件个数):6647 标注数量(txt文件个数):6647 标注…

数据结构与算法——顺序表期末复习五大经典题型

目录 一:顺序表-移除元素 二:顺序表-删除有序数组中的重复项 三:顺序表-合并两个有序数组 四:顺序表-旋转数组 五:顺序表-数组形式的整数加法 一:顺序表-移除元素 题型链接:27. 移除元素 -…

npm切换为淘宝镜像源

要切换 npm 的镜像源,您可以使用以下几种方法: 前言 然而,由于众所周知的网络环境问题,直接使用npm官方源下载依赖包时,常常会遇到速度慢甚至下载失败的情况。因此,使用更稳定、更快速的国内镜像源就显得尤…

【Python】探索Magenta:音乐与艺术的机器智能创作

下班了,今天的苦就先吃到这里。 在人工智能的浪潮中,机器学习技术正逐渐渗透到艺术创作的各个领域。今天,我们来探索一个特别的项目——Magenta,它是由Google Brain团队发起的,旨在使用机器智能生成音乐和艺术。这个项…

实战讲稿:Spring Boot整合MyBatis

文章目录 实战讲稿:Spring Boot整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工方法2.6 测试…

WAAP解决方案:守护数字时代的安全盾牌

在当今这个数字化、数据驱动的时代,网络安全已成为企业运营中不可或缺的一环。随着Web应用程序和API接口在业务中的广泛应用,其面临的安全威胁也日益复杂多变。为此,WAAP(Web Application and API Protection)解决方案…

上市公司-客户ESG数据集(dta+xlsx+参考文献)(2009-2023年)

参考《经济问题》中李普玲(2024)的做法,将供应商与主要客户数据对应起来,并对上市公司及关联上市公司的ESG数据进行匹配,形成“供应商——客户ESG”的数据集,保留客户的销售占比 一、数据介绍 数据名称&am…

ROS和ROS2借助智能大模型的学习和研究方法

机器人相关知识的本身和价值-CSDN博客 知识本身在智能时代毫无价值,需要基于知识应用和创新才有价值。 学历报废并非来自扩招,而是智能模型的快速发展。-CSDN blink-领先的开发者技术社区 2024年中秋,智能模型实力已经如此,但还…

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后: MyBatis 的官方文档:https://mybatis.p2hp.com/ 关于 MyBa…

宝兰德MCP系列介绍 ①:中间件管理能力全线升级,驱动企业数字化管理效能提升

在企业数字化转型加速与新技术涌现下,中间件作为衔接底层基础设施和上层业务应用的桥梁,应用愈发广泛且关键。但为了有效管理并维护众多类型的中间件,企业需更多专业运维与资源,这大大分散业务焦点并提升成本。因此,优…

Linux进程间通信——探索共享内存—— 剖析原理, 学习接口应用

前言:本节内容主要讲解进程间通信的, systemV版本下的共享内存。 共享内存,顾名思义, 其实就是一块内存, 它不同于管道是一个文件。 所以它的传输速度是很快的。 因为管道是文件,有缓冲区, 而共…

HDMI色块移动——FPGA学习笔记13

一、方块移动原理 二、实验任务 使用FPGA开发板上的HDMI接口在显示器上显示一个不停移动的方块,要求方块移动到边界处时能够改变移动方向。显示分辨率为800*480,刷新速率为90hz。(480p分辨率为800*480,像素时钟频率Vga_clk 800x4…

Django后台管理复杂模型

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战(视频教学版)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) Django框架…

libyuv之linux编译

文章目录 一、下载源码二、编译源码三、注意事项1、银河麒麟系统(aarch64)(1)解决 armv8-adotprodi8mm 指令集支持问题(2)解决 armv9-asve2 指令集支持问题 一、下载源码 到GitHub网站下载https://github.…

荣誉 | 分贝通入选2024「Cloud 100 China」

近日,2024 Cloud 100 China 榜单于美高梅酒店正式发布,这是靖亚资本和崔牛会联合推出的第三届榜单。 全球商旅管理、企业支出全流程管控、数据BI全方位降本、AI赋能高效出行体验.......近年来,分贝通不断精进产品能力及BI&AI能力,再次上榜。 本届评选,组委会基于过去一年融…

从HarmonyOS升级到HarmonyOS NEXT-环信SDK数据迁移

前言:2024年6月21日 HarmonyOS NEXT (后续称之为 NEXT) 正式发布,随着 NEXT 稳定版的逐渐临近,各个应用及SDK正在忙于适配 NEXT 系统,同样也面临着系统升级时如何对数据的迁移适配。本文通过使用环信 SDK 介…

Unity 高亮插件HighlightPlus介绍

仅对官方文档进行了翻译 注意:官方文档本身就落后实际,但对入门仍很有帮助,核心并没有较大改变,有的功能有差异,以实际为准.(目前我已校正了大部分差异,后续我会继续维护该文档) 为什么为该插件做翻译?功能强大,使用简单,且还在维护. 基于此版本的内置渲染管线文档 快速开始…

深度剖析去中心化存储:IPFS、Arweave 和 BNB Greenfield 的技术革新与生态系统演进

引言: 在数字时代的浪潮中,数据已然成为驱动创新和决策的核心资产。然而,随着数据量呈指数级增长,传统中心化存储模式面临着前所未有的挑战。安全漏洞、隐私泄露、数据垄断等问题日益凸显,促使技术界重新思考数据存储…