Flask 设置session 自定义登录验证

"""1. 设置session# 设置session成功 重定向到首页session.permanent = True  # 设置会话过期时间session['info'] = usernamereturn redirect(url_for('index'))2. 获取sessioninfo = session.get('info', default=0)return render_template('index.html', info=info)3. 设置session会话有效期1. session.permanent = True  # 设置会话过期时间2. # 两种设置会话有效期时间方法# app.permanent_session_lifetime = datetime.timedelta(days=2)  # 会话有效期2天app.permanent_session_lifetime = 60 * 60 * 24 * 7  # 会话有效期7天4. 删除session# 删除会话session.pop('info', None)return redirect(url_for('login'))"""

 

 

 

 


import datetimefrom flask import Flask, render_template, redirect, url_for, request, session, make_response, Response
from functools import wrapsdef auth(fn):@wraps(fn)def inner(*args, **kwargs):if not session.get('info', None):return redirect(url_for('login'))return fn(*args, **kwargs)return innerapp = Flask(__name__)
app.secret_key = "ghakjhkghkahkhgkhalkfdngkasnkglhaj"
# 两种设置会话有效期时间方法
# app.permanent_session_lifetime = datetime.timedelta(days=2)  # 会话有效期2天
app.permanent_session_lifetime = 60 * 60 * 24 * 7  # 会话有效期7天
print(app.url_map)@app.route('/')
@app.route('/index', methods=["GET", "POST"])
@auth
def index():# 获取会话info = session.get('info', default=0)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="不能为空")elif not username:return render_template('login.html', errors="用户名有误")elif password != confirm_password:return render_template('login.html', errors="密码不一致")elif username == "root" and password == "123":# 设置session成功 重定向到首页session.permanent = True  # 设置会话过期时间session['info'] = usernamereturn redirect(url_for('index'))else:return render_template('login.html', errors="账号或密码有误")return render_template('login.html')@app.route('/logout', methods=["GET", "POST"])
@auth
def logout():# 删除会话session.pop('info', None)return redirect(url_for('login'))@app.route('/test')
@auth
def test():return "测试"if __name__ == '__main__':app.run(debug=True)

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java笔试面试题AI答之单元测试JUnit(6)

文章目录 31. 如果将JUnit测试方法声明为“私有”会发生什么?1. 测试方法不会被JUnit执行2. 违反JUnit的设计原则3. 潜在的测试覆盖率问题4. 解决方案 32. 如果声明JUnit测试方法返回“String”会发生什么?编译错误运行时行为正确的做法结论 33. 可以使用…

变电站缺陷隐患检测图像数据集,总共包含8000张图片,包含渗漏油,鸟巢,表盘破损,呼吸器变色等

变电站缺陷隐患检测图像数据集,总共包含8000张图片,包含渗漏油,鸟巢,表盘破损,呼吸器变色等。 变电站缺陷隐患检测图像数据集营销介绍 数据集名称 变电站缺陷隐患检测图像数据集(Substation Defect Detect…

微分电路设计

1 简介 微分电路会根据电路时间常数和放大器的带宽来输出某个频率范围内输入信号的微分。向反相输入施加输入信号,输出相对输入信号的极性会反相。理想的微分器电路基本都不稳定,需要增加输入电阻器和反馈电容器,才能达到稳定,但是…

让《米小圈动画中国史》来为孩子打开浩瀚历史的书页!

当我们漫步在浩瀚的历史长河中,每一段故事、每一个人物都如璀璨星辰般闪烁。历史不仅是过去的记忆,更是一面镜子,映射出民族的辉煌与艰辛。然而,对于我们的孩子而言,传统的历史教材常常显得枯燥而乏味。作为家长&#…

【MATLAB源码-第224期】基于matlab的快跳频系统仿真采用4FSK,模拟了单音干扰,宽带干扰以及部分频带干扰,输出误码率曲线以及各节点图像

操作环境: MATLAB 2022a 1、算法描述 跳频通信系统概述 跳频通信系统是一种通过快速切换载波频率来进行信息传输的无线通信技术。它在军事和商业通信中广泛应用,具有较强的抗干扰和抗截获能力。系统设计主要包括信号调制、跳频序列生成、信道模拟以及…

链表的合并,结点逆置,顺序表的高效划分(数据结构作业02)

目录 链表的合并 链表的结点逆置 顺序表的高效划分 链表的合并 已知两个递增有序的单链表A和B,分别表示两个集合。试设计一个算法,用于求出A与B的交集,并存储在C链表中。例如 : La {2,4,6,8};…

如何使用命令行快速下载Google Drive/OneDrive大文件

OneDrive OneDrive使用wget下载会出现403 forbidden,可通过下面方法下载。 浏览器右键进入检查界面,选择netowork,搜索download.aspx,然后在待下载文件处点击下载,即可出现下载链接,复制为cURL即可下载。…

【Prompt Engineering:ReAct 框架】

ReAct 框架 从 Yao 等人,2022(opens in a new tab) 引入了一个框架,其中 LLMs 以交错的方式生成 推理轨迹 和 任务特定操作 。 生成推理轨迹使模型能够诱导、跟踪和更新操作计划,甚至处理异常情况。操作步骤允许与外部源(如知识…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

Rust GUI框架Tauri V1 入门

文章目录 Tauri介绍Vite开始创建 Rust 项目 调用指令window.__TAURI_INVOKE__.invoke is undefined 问题 参考资料JavaScript 模块Vue 框架Vue RouteviteNuxt gitignore文件上传到csdn gitcode网站端本地端 gitcode发布 Tauri介绍 Tauri是一款用Rust构建的开源框架&#xff0c…

Linux操作系统面试题记录

一、进程与线程 1.并发和并行的区别 并发:一个cpu处理器处理多个任务; 并行:多个cpu处理器处理多个任务; 2.进程和线程是什么?区别?何时用线程何时用进程? Linux中其实没有进程线程之分&…

少儿编程小游戏 —— Scratch 火柴人勇者传说

在线玩:Scratch动作冒险游戏 – 火柴人勇者传说免费下载-小虎鲸Scratch资源站 在少儿编程的世界里,创造属于自己的游戏是一件既有趣又富有挑战的事情。而今天要介绍的游戏——《火柴人勇者传说》,便是一个充满冒险精神的作品,专为…

【PCB工艺】表面贴装技术中常见错误

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 1、什么是SMT和SMD2、表面贴装技术的优势是什么?3、通孔和表面贴装技术之间的区别是什么?4、焊…

MySQL-DQL(数据查询语言)

数据查询语言(DQL-Data Query Language) 代表关键字:select MySQL语句执行顺序 1、基础操作 1.1 启动服务 a.手动启动 我的电脑->右键->管理->服务->mysql->右键启动/启动 b.命令方式 在管理员模式下运行cmd,执行如下操作: net sta…

轻量桌面应用新星:Electrico,能否颠覆Electron的地位?

在桌面应用开发的世界里,Electron曾经是一位风云人物。它让开发者可以用熟悉的Web技术构建跨平台应用,但它的重量级体积和系统资源的高消耗一直让人头疼。现在,一个新工具悄然登场,试图解决这些问题——Electrico,一个轻量版的桌面应用开发框架。 10MB取代数百MB,你不…

计算机人工智能前沿进展-大语言模型方向-2024-09-16

计算机人工智能前沿进展-大语言模型方向-2024-09-16 1. Securing Large Language Models: Addressing Bias, Misinformation, and Prompt Attacks B Peng, K Chen, M Li, P Feng, Z Bi, J Liu, Q Niu - arXiv preprint arXiv:2409.08087, 2024 保护大型语言模型:…

Solid Converter PDF10.1安装教程

软件介绍 Solid Converter PDF是一套专门将PDF文件转换成word的软件,除了转换成word文件外,还可以转换成RTF以及Word XML文件。除此之外,它还有一个图片撷取功能,可以让我们]将PDF档里的图片撷取出来,以及将PDF档里的…

【计算机基础】关于存储的各种概念

综述 在了解存储设备的过程中涉及到了很多的概念,本文将一一说明。 在介绍存储设备的时候会出现很多概念,这里简单说明下。 总线:这里指的是CPU与存储设备的链路。目前有SATA、PCIe、SAS等。协议:这里指的是CPU与存储设备之间约…

二、Servlet

文章目录 1. Servlet技术1.1 什么是Servlet1.2 手动实现 Servlet 程序1.3 url 地址到 Servlet 程序的访问1.4 Servlet 的生命周期1.5 GET 和 POST 请求的分发1.6 通过继承 HttpServlet 实现 Servlet 程序1.7 使用 IDEA 创建 Servlet 程序1.8 Servlet 类的继承体系 2. ServletCo…

OpenFeign接口调用日志

一、介绍 在开发或测试环境中,需要更多的调试信息;在通过 Spring Cloud OpenFeign 调用远程服务的接口时,可能需要记录接口调用的日志详情,比如:请求头、请求参数、响应等。 Spring Cloud OpenFeign 打印 FeignClien…