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

这篇具有很好参考价值的文章主要介绍了Flask基于flask_login实现登录、验证码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

依赖

flask
flask_wtf
flask_sqlalchemy
captcha
werkzeug

效果

Flask基于flask_login实现登录、验证码,python,flask,python,后端

入口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/文章来源地址https://www.toymoban.com/news/detail-852399.html

到了这里,关于Flask基于flask_login实现登录、验证码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何使用Flask-Login来实现用户身份验证和安全性?

    当你想要在你的Flask应用中实现用户身份验证和安全性时,Flask-Login这个扩展将会是你的最佳伙伴。它提供了一组简单而强大的工具来处理用户登录、注销和其他安全相关的操作。下面,我将以一个新手的角度,用尽可能轻松的语气来解释如何使用Flask-Login。 首先,你需要在你

    2024年02月15日
    浏览(33)
  • flask自己写登录验证和角色验证

    python flask程序需要用户登录也需要角色验证,可以采用如下方法 函数代码 这个的需要admin权限用户才可以访问 技术无止境

    2024年02月15日
    浏览(26)
  • 【Python开发】一文详解Flask-Login

    Flask-Login 为 Flask 提供用户会话管理。它处理登录、注销和长时间记住用户会话等常见任务。 Flask-Login 不绑定到任何特定的数据库系统或权限模型。唯一的要求是您的 用户对象实现一些方法 ,并且您向能够 从用户 ID 加载用户 的扩展提供回调。 GitHub:https://github.com/maxcountr

    2023年04月12日
    浏览(27)
  • 基于flask-oidc的OIDC协议授权码模式单点登录SSO实现

    关于SSO单点登录、OIDC协议、授权码模式等相关概念详见基于OIDC的SSO单点登录文章内容 应用注册: 在提供OIDC服务的认证系统中注册应用信息 授权流程: 携带由应用生成的 state (防CSRF跨域信息)和在认证系统中注册的应用信息重定向请求认证系统的授权服务 授权服务重定向到登

    2024年02月13日
    浏览(57)
  • flask不使用flask-login插件

    由于flask版本升级问题,flask-manager里面的Command命令高版本不支持,低版本的兼容flask-sqlalchemy启动也会报错,第三方插件有很多问题,所以痛定思痛决定放弃使用这个,使用flask自带语法自己写一个 类似于django继承django.contrib.auth.User一样 request.user全局一样,可以获取到用户信

    2024年01月18日
    浏览(27)
  • 菜鸟级:Vue Element-UI 前端 + Flask 后端 的登录页面验证码

    这里记录登录页面验证码的做法,采取的是前后端分离的做法,前端用Vue,后端用Flask 首先是GIF效果图: 后端返回的数据结构(base64字符串,response.data.img):   1、Vue前端页面基本采用Ruoyi Ui里面的登录页面代码,里面的一些方法进行重写; 首先是单个vue文件里网页内容

    2023年04月08日
    浏览(47)
  • Flask-SocketIO和Flask-Login联合开发socketio权限系统

    设置 Flask, Flask-SocketIO, Flask-Login : 首先,确保安装了必要的库: 基础设置 : 定义登录路由 : 定义 SocketIO 路由并进行身份验证 : 简单的登录页面 ( templates/login.html ) : 简单的首页 ( templates/index.html ) : 创建一个简单的首页 ( index.html ),用户登录后可以发送消息到服务器,然后接收服

    2024年02月11日
    浏览(28)
  • python基于flask实现swagger在线文档以及接口测试

    阅读对象:知道什么是restful,有了解swagger或者openAPI更佳。 Representional State Transfer(REST):表征状态转移。是一种一种基于HTTP协议的架构。采用Web 服务使用标准的 HTTP 方法 (GET/PUT/POST/DELETE) 将所有 Web 系统的服务抽象为资源。 如果REST满足一定条件(C/S、无状态、分层系统、

    2024年02月12日
    浏览(30)
  • 【python】flask基于cookie和session来实现会话控制

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN新星创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开

    2024年03月24日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包