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

news2024/11/26 10:44:32

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 string

from 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 ImageCaptcha

login_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.digits
    captcha = ''.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'] = captcha
    data = 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 DataRequired


class 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 SQLAlchemy


db = 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_hash

from models import db, User

app = 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.coloradmin.cn/o/1587730.html

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

相关文章

DAY03|203.移除链表元素、707.设计链表、206.反转链表

203.移除链表元素、707.设计链表、206.反转链表 LeetCode 203.移除链表元素LeetCode 707.设计链表LeetCode 206.反转链表双指针法递归法 LeetCode 203.移除链表元素 注意&#xff0c;在dummy上操作&#xff0c;返回也返回dummy->next 如果头铁想返回head&#xff0c;那样会…

Redis入门到通关之Redis介绍

文章目录 1.Redis简单介绍1.1 非关系型数据库介绍 2.本文介绍如下内容3.初始Redis3.1.认识NoSQL3.1.3.查询方式3.1.4.事务3.1.5.总结 3.2.认识Redis3.3 安装Redis 1.Redis简单介绍 Redis是一种键值型的 NoSql 数据库&#xff0c;这里有两个关键字&#xff1a; 键值型NoSql 其…

负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行…

C++算法 —— 回溯(二)

一、字母大小写全排列 1.链接 784. 字母大小写全排列 - 力扣&#xff08;LeetCode&#xff09; 2.描述 3.思路 首先&#xff0c;根据题意&#xff0c;这是一个不能重复的全排列&#xff0c;并且根据特定的规则&#xff0c;我们需要分三种情况&#xff0c;一种是当字符为数字…

Android源码解析之截屏事件流程

今天这篇文章我们主要讲一下Android系统中的截屏事件处理流程。用过android系统手机的同学应该都知道&#xff0c;一般的android手机按下音量减少键和电源按键就会触发截屏事件&#xff08;国内定制机做个修改的这里就不做考虑了&#xff09;。那么这里的截屏事件是如何触发的呢…

基于spring boot的班级综合测评管理系统

基于spring boot的班级综合测评管理系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

Linux进阶篇:linux操作系统一个神奇的分区:swap交换分区

linux操作系统一个神奇的分区&#xff1a;swap交换分区 1 Swap交换分区概念 Linux内核为了提高读写效率与速度&#xff0c;会将文件在内存中进行缓存&#xff0c;这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后&#xff0c;Cache Memory也不会自动释放。这就…

微信小程序 django+nodejs电影院票务售票选座系统324kd

小程序Android端运行软件 微信开发者工具/hbuiderx uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端&#xff1a;HTML5,CSS3 VUE 后端&#xff1a;java(springbootssm)/python(flaskdja…

网盘——显示在线用户

1、查看在线用户 客户端发送查看请求&#xff08;只发送用户的名字&#xff09;&#xff0c;服务器将数据库中在线的用户查询出来并发送给客户端&#xff0c;客户端接收在线用户信息并作显示。 1.1、查看数据库的数据&#xff0c;在这里需要使用socket&#xff0c;所以我们在…

springboot相关报错解决

Caused by: java.lang.ClassNotFoundException: 目录 Caused by: java.lang.ClassNotFoundException: org.springframework.context.event.GenericApplicationListener spring-boot-dependencies:jar:2.1.9.RELEASE was not found org.springframework.context.event.Generi…

界面设计【1】-项目的UI设计css

引言&#xff1a; 本篇博客对简单的css html界面设计做了简要介绍 这篇博客主要就是介绍了做横向项目中&#xff0c;CSS界面设计与优化。 界面设计【1】-项目的UI设计css 1. 什么是css?2. css编程demo3. 可视化效果 1. 什么是css? CSS是层叠样式表&#xff08;Cascading S…

大型语言模型有什么用?

大型语言模型有什么用&#xff1f; 大型语言模型识别、总结、翻译、预测、生成文本和其他内容。 AI 应用程序正在总结文章、撰写故事和进行长时间对话——而大型语言模型正在承担繁重的工作。 大型语言模型或 LLM 是一种深度学习算法&#xff0c;可以根据从海量数据集中获得…

【PHP程序设计(高阶版)】——PHP操作MySQL教程

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Linux C应用编程:MQTT物联网

1 MQTT通信协议 MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传 输&#xff09;是一种基于客户端-服务端架构的消息传输协议&#xff0c;如今&#xff0c;MQTT 成为了最受欢迎的物联网协议&#xff0c;已广泛应用于车联网、智能家居、即时聊…

TikTok怎么开通ads账户

一、TikTok的两种主流玩法 1、付费流量 蓝V认证TikTokAds&#xff08;广告消耗达到3w美金可申请蓝V认证&#xff09; 可以快速引流到独立站 2、免费流量 自己运营种草号、开直播 二、TikTok Ads如何开户&#xff1f; 开通广告账户 首先国内是无法自己申请TikTok Ads的&a…

精彩回顾 | 「AI 驱动增长,研发数智化升级」分享沙龙成功举办

AI 应用元年&#xff0c;人工智能技术将如何助力企业发展新质生产力&#xff0c;构建增长动能&#xff1f; 日前&#xff0c;LigaAI 与深圳市企业联合会、西云数据联合举办了「AI 驱动增长&#xff0c;研发数智化升级」技术专题沙龙。本次活动围绕「AI」应用实践&#xff0c;邀…

【QingHub】EMQX单节点一键部署

EMQX 简介 EMQX是全球最具扩展性的开源MQTT 代理&#xff0c;具有高性能&#xff0c;可在 1 个集群中连接 1 亿多个 IoT 设备&#xff0c;同时保持每秒 100 万条消息的吞吐量和亚毫秒级的延迟。 EMQX 支持MQTT、HTTP、QUIC、WebSocket等多种开放标准协议。它 100% 符合MQTT 5.…

电商技术揭秘十九:电商平台的智能化与自动化技术

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

Spring Web MVC的入门学习(二)

本篇接着Spring Web MVC的入门学习&#xff08;一&#xff09;-CSDN博客来继续学习Spring MVC。 一、从请求中获取Header 1、传统获取 header 获取Header也是从 HttpServletRequest 中获取。 代码&#xff1a; import jakarta.servlet.http.HttpServletRequest; import jakar…

社交网络的未来图景:探索Facebook的发展趋势

随着科技的不断进步和社会的快速变迁&#xff0c;社交网络作为连接人与人之间的重要纽带&#xff0c;扮演着日益重要的角色。而在众多社交网络中&#xff0c;Facebook作为老牌巨头&#xff0c;一直在探索着新的发展路径&#xff0c;引领着社交网络的未来图景。本文将深入探索Fa…