Flask基于flask_login实现登录、验证码

flask_login 是一个 Flask 扩展,用于在 Flask web 应用中实现用户会话管理。它允许你跟踪哪些用户已经登录,并管理他们的登录状态。flask_login 提供了用户认证的基础结构,但具体的用户验证(如用户名和密码检查)和存储(如数据库)需要你自行实现。

以下是 flask_login 的一些主要特性和功能:
用户登录和注销:提供用户登录和注销的接口。
用户认证:通过装饰器(如 @login_required)确保只有已登录的用户才能访问特定的视图或路由。
用户会话管理:管理用户的登录状态,并提供一个安全的方式来跟踪用户会话。
用户信息:提供一个方式来获取当前登录用户的信息。

依赖

flask
flask_wtf
flask_sqlalchemy
captcha
werkzeug

效果

1

入口app

实现用户登录和注销的逻辑。这通常涉及到验证用户的凭据(如用户名和密码),并设置或清除用户的登录状态。

app.py

import random
import stringfrom flask import Flask, redirect, url_for, render_template, flash, session, Response
from flask_login import LoginManager, login_user, logout_user, login_required, current_user
from models import User, db
from LoginForm import LoginForm
from captcha.image import ImageCaptchalogin_manager = LoginManager()
image = ImageCaptcha()app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://user:pass@127.0.0.1/db"
app.config['SECRET_KEY'] = 'sd23rhewer'
login_manager.init_app(app)
login_manager.login_view = 'login'
db.init_app(app)def generate_captcha():"""生成验证码文字"""characters = string.ascii_letters + string.digitscaptcha = ''.join(random.choice(characters) for i in range(4))return captcha@login_manager.user_loader
def load_user(user_id):"""加载用户"""return User.query.get(int(user_id))@app.route("/")
def index():"""前台首页"""return render_template('index.html')@app.route('/dashboard')
@login_required
def dashboard():"""后台首页"""return render_template('dashboard.html', current_user=current_user)@app.route('/login', methods=['GET', 'POST'])
def login():"""登录"""form = LoginForm()if form.validate_on_submit():captcha_session = session.get('capcha', '')print(captcha_session, '  ', form.captcha.data)if captcha_session.lower() != form.captcha.data.lower():flash("验证码错误")return redirect(url_for('login'))user = User.query.filter_by(username=form.username.data).first()if user is None or not user.check_password(form.password.data):flash("用户名或密码错误")return redirect(url_for('login'))login_user(user, remember=True)return redirect(url_for('dashboard'))return render_template('login.html', form=form)@app.route('/captcha_image', methods=['GET', 'POST'])
def captcha_image():"""验证码图片"""captcha = generate_captcha()session['capcha'] = captchadata = image.generate(captcha)print(captcha)return Response(data, mimetype="image/png")@app.route('/logout', methods=['GET', 'POST'])
def logout():"""退出"""logout_user()return redirect(url_for('index'))

表单

LoginForm.py

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField
from wtforms.validators import DataRequiredclass LoginForm(FlaskForm):username = StringField('用户名', validators=[DataRequired('输入用户名')])password = PasswordField('密码', validators=[DataRequired('输入密码')])captcha = StringField('验证码', validators=[DataRequired('输入验证码')])submit = SubmitField('提交')

数据库模型

在你的 Flask 应用中,你需要配置 flask_login,并定义一个用户类。这个用户类通常继承自 UserMixin,它提供了默认的用户属性和方法。

models.py

# coding: utf-8
from flask_login import UserMixin
from sqlalchemy import Column, DateTime, String, text
from sqlalchemy.dialects.mysql import INTEGER
from werkzeug.security import generate_password_hash, check_password_hash
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy(engine_options={'pool_pre_ping': True})class User(UserMixin, db.Model):__tablename__ = 'xt_user'id = Column(INTEGER(11), primary_key=True)username = Column(String(50, 'utf8_unicode_ci'))password = Column(String(1024, 'utf8_unicode_ci'))create_at = Column(DateTime, server_default=text("CURRENT_TIMESTAMP"))def set_password(self, password):self.password = generate_password_hash(password)def check_password(self, password):return check_password_hash(self.password, password)

模板

templates/login.html

{% with messages = get_flashed_messages() %}{% if messages %}<ul class=flashes>{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>{% endif %}
{% endwith %}
<form method="POST">{{ form.hidden_tag() }}<p>{{ form.username.label }}<br>{{ form.username() }}</p><p>{{ form.password.label }}<br>{{ form.password() }}</p><p>{{ form.captcha.label }}<br>{{ form.captcha() }}<img src="{{ url_for('captcha_image') }}" alt="Captcha" width="200", height="70"></p><p>{{ form.submit() }}</p>
</form>

templates/dashboard.html

在视图函数中,你可以使用 current_user 对象来获取当前登录用户的信息。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>面板</title>
</head>
<body>
<p>您好,{{ current_user.username }}&nbsp;<a href="/logout">退出</a></a></p>
</body>
</html>

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>
<p><a href="/login">登录</a></a></p>
</body>
</html>

初始化数据

from flask import Flask
from werkzeug.security import generate_password_hashfrom models import db, Userapp = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://user:pass@127.0.0.1/db"
db.init_app(app)def init_data():u1 = User(username='abc', password=generate_password_hash('123'))db.session.add_all([u1])db.session.commit()with app.app_context() as context:init_data()

参考

https://flask-login.readthedocs.io/en/latest/

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

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

相关文章

泽众Testone自动化测试平台,测试用例支持单个调试执行,同步查看执行日志

泽众Testone自动化测试平台之前版本&#xff0c;测试用例批量和单个执行&#xff0c;必须要通过测试集操作执行&#xff0c;操作略繁琐&#xff0c;我们通过本轮优化升级&#xff0c;测试用例直接可以单个调试执行&#xff0c;同步查看执行日志&#xff0c;操作上去繁就简&…

OJ刷题日记:1、双指针(1)

目录 1、283.移动零 2、1089.复写零 3、202.快乐数 1、283.移动零 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 …

第十届 蓝桥杯 单片机设计与开发项目 省赛

第十届 蓝桥杯 单片机设计与开发项目 省赛 输入&#xff1a; 频率信号输入模拟电压输入 输出&#xff08;包含各种显示功能&#xff09;&#xff1a; LED显示SEG显示DAC输出 01 数码管显示问题&#xff1a;数据类型 bit Seg_Disp_Mode;//0-频率显示界面 1-电压显示界面 un…

电脑无法开机?原因分析与解决方案

电脑无法开机是一种常见的问题&#xff0c;可能会给用户带来诸多困扰。无法启动可能是由于硬件故障、软件问题或者其他未知原因引起的。在本文中&#xff0c;我们将介绍三种常见的方法来解决电脑无法开机的问题&#xff0c;以帮助用户尽快恢复正常使用。 方法1&#xff1a;检查…

6、ipex-llm(原bigdl-llm)大模型微调

ipex-llm环境配置及模型下载 QLORA是一种高效微调方法&#xff0c;可以将内存使用降低到足以在单个48GB GPU上微调一个拥有65B参数的模型&#xff0c;同时保持完整的16位微调任务性能。QLORA通过一个冻结的、4位量化的预训练语言模型将梯度反向传播到低秩适配器&#xff08;Lo…

什么是队列

队列是一种特殊类型的线性表&#xff0c;其只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作。具体来说&#xff0c;允许插入的一端称为队尾&#xff0c;而允许删除的一端称为队头。这种数据结构遵循“先进先出”&#xff08;FIFO&#xff09;的原则&#xff0c;即…

python实现OCR

python实现OCR 在Python中实现OCR&#xff08;光学字符识别&#xff09;通常需要使用第三方库&#xff0c;如pytesseract。以下是使用pytesseract进行OCR的基本步骤&#xff1a; 安装pytesseract和相关的OCR库&#xff0c;如tesseract-ocr。 使用pytesseract库的image_to_str…

从字符串到JSON对象:解析MinIO配置的Java实践

在日常开发中&#xff0c;我们经常需要从外部配置源&#xff08;如参数配置、环境变量、配置文件等&#xff09;获取服务所需的特定配置信息。本文将以一个具体需求为例&#xff0c;介绍如何使用Java处理字符串形式的MinIO存储服务配置&#xff0c;将其转化为JSON对象并提取关键…

ubuntu安装irtualbox注意事项

下载官网7.0版本&#xff0c;ubuntu22.04,安装一直出错误&#xff0c;查到了下面兄弟的办法&#xff0c;仍然不幸&#xff0c;最后使用apt重装&#xff0c;请按第二部分流程安装&#xff0c;安装6.1,可以用 第一部分&#xff0c;反正我是没搞通&#xff0c;7.0反复的出现相同的…

C语言读取 .ico 文件并显示数据

原来是想做光标编辑器&#xff0c;自己把绘图板的内容导出为光标格式 鼠标指针文件格式解析——Windows&#xff08;一&#xff09; (qq.com) 代码来源自 Icons | Microsoft Learn 鄙人又补充些变量可以运行微软的代码 简单代码如下 #include <stdio.h> #include &l…

神经网络模型底层原理与实现8-BERT

首先介绍什么是自监督学习&#xff1a; 普通的有监督学习是每个x对应有个y&#xff0c;x训练得到y&#xff0c;将y与y作比较&#xff0c;而自监督是没有对应y&#xff0c;直接把一部分样本x作为训练目标x&#xff0c;训练得x后和x对比 bert中如何创造x&#xff1a;以文字处理为…

4/11 QT_day5

服务器端 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QMessageBox> #include <QTcpSocket> #include <QList> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass …

MSTP/RSTP与STP的兼容性

原理概述 MSTP(Multiple STP)协议和RSTP(Rapid STP)协议都可以向下兼容STP&#xff08;Spanning Tree Protocol &#xff09;协议。运行MSTP/RSTP协议的交换机会根据收到的BPDU版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU&#xff0c;MSTP/RSTP交换机…

Oracle 21c 数据库迁移到DM8(达梦)数据库

一、环境准备 1、创建脚本 执行dmCreateUser.sql脚本创建GLJ用户&#xff08;注意&#xff1a;需要与需要迁移的oracle用户名一样&#xff09;&#xff0c;如&#xff0c;脚本内容如下&#xff1a; -- 开始将输出重定向到指定的日志文件 spool start /home/dmdba/dmdbms/sql/…

蓝桥杯算法题:蓝桥骑士

题目描述 小明是蓝桥王国的骑士&#xff0c;他喜欢不断突破自我。 这天蓝桥国王给他安排了 N 个对手&#xff0c;他们的战力值分别为 a_1,a_2,…,a_n&#xff0c;且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战&#xff0c;也可以选择避战。 身为高傲的骑士&#xff…

基于物联网的智能家居远程视频监控系统设计与实现

基于物联网的智能家居远程视频监控系统设计与实现 摘要&#xff1a;随着物联网技术的快速发展&#xff0c;智能家居系统已成为提升家居安全性和便利性的重要手段。本文设计并实现了一套基于物联网的智能家居远程视频监控系统&#xff0c;该系统结合了嵌入式技术、网络通信技术…

节流和防抖

节流和防抖 定义和区别: 节流和防抖的概念。 节流是一种减少函数执行频率的技术&#xff0c;它通过设定一个等待时间(delay)&#xff0c;确保函数在这段时间内只执行一次。如果在等待时间内再次触发事件&#xff0c;则不会执行函数&#xff0c;直到等待时间结束。 防抖是一种控…

【Go语言】go语言简单的变量声明和结构体使用

目录 数字类型 布尔类型 字符串类型 Rune 类型 Byte 类型 类型转换 结构体 结构体定义 结构体作为函数参数 结构体方法 1. 接收者类型 2. 方法定义 3. 值接收者 vs 指针接收者 4. 调用方式的灵活性 5. 方法集 6. 方法与继承 7. 方法声明的位置 在Go语言中&…

【Linux】sudo分权管理实战

一般sudo命令是默认安装的&#xff0c;如果你的机器里没有&#xff0c;可以使用命令 yum install sudo 来安装 [rootgaosh-64 ~]# yum install sudo 我们来看一下配置文件&#xff1a; 在上图root下面添加一行 &#xff0c;给gaosh用户加权限 [rootgaosh-64 ~]# vim /etc/su…

中移物联网 OneOS 操作系统环境搭建和工程创建

一、官网 OneOS Lite是中国移动针对物联网领域推出的轻量级操作系统&#xff0c;具有可裁剪、跨平台、低功耗、高安全等特点&#xff0c;支持ARM Cortex-A和 Cortex-M、MIPS、RISC-V等主流芯片架构&#xff0c;兼容POSIX、CMSIS等标准接口&#xff0c;支持Javascript、MicroPyt…