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;检查…

什么是队列

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

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/…

【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…

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm 点击 网盘下载 进行下载 2、双击下载好的 nvm-1.1.12-setup.zip 文件 3.双击 nvm-setup.exe 开始安装 4. 选择我接受&#xff0c;然后点击next 5.选择nvm安装路径&#xff0c;路径名称不要有空格&#xff0c;然后点击next 6.node.js安装路径&#…

哨兵-1A与DInSAR技术监测尼泊尔地震前后地表形变

2015年4月25号&#xff0c;尼泊尔发生里氏7.8级地震&#xff0c;超过5000人伤亡和几百万人受到影响。大量的卫星影像支持地震救援。地理学家利用卫星影像量测地震对陆地的影响。 Sentinel-1A是欧洲委员会发起的哥白尼环境监测计划中的第一颗卫星。可获取全天候的数据&#xff0…

实验6 单臂路由方式实现VLAN间路由

实验6 单臂路由方式实现VLAN间路由 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤1.配置IP地址2.交换机配置3.路由器配置 一、 原理描述 VLAN将一个物理的LAN在逻辑上划分为多个广播域。VLAN内的主机间可以互相通信&#xff0c;但是VLAN之间却不能互通。…

JAVAEE——网络初始

文章目录 网络发展史独立模式网络模式局域网LAN路由器的诞生 网络通信的基础IP地址端口号 认识协议OSI七层模型TCP/IP五层模型 网络发展史 独立模式 在原始的年代中电脑间想要通信需要两台电脑连接一根网线&#xff0c;但是一台电脑基本上只有一个接口。因此想要链接更多的电…

计算机基础知识-第9章-存储的本质(2)——硬盘和文件系统基础知识

一、机械硬盘的原理 概括来说&#xff0c;硬盘的工作原理是利用特定的磁粒子的极性来记录数据。磁头在读取数据时&#xff0c;将磁力子的不同极性转换成不同的电脉冲信号&#xff0c;再利用数据转换器将这些原始信号变成电脑可以使用的数据&#xff0c;写的操作正好与此相反。…

ubuntu或类Debian获取某些包的离线版本-包括依赖(还有一些意想不到的用途,哈哈)

前言 偶尔能碰到很特殊的情况。网址白名单&#xff0c;纯内网&#xff0c;超多依赖及一些很难描述的场景。 比如一些少见的发行版缺少某些包。这时候可以找一台类似的系统环境来下载离线包及 其依赖包&#xff0c;然后转移到内网进行安装。如果是网址白名单&#xff0c;或者纯内…

【讲解下常见的分类算法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…