Flask-14-登录认证

一、介绍

Flask-Login 为 Flask 提供用户会话管理。它处理常见的 登录、注销和记住用户会话的任务延长的时间。
它将:

  • 将活动用户的 ID 存储在 Flask session中,并让您轻松记录请求与响应。

  • 允许您将视图限制为已登录(或已注销)的用户。

  • 处理“记住我”功能。

  • 帮助保护用户的会话不被 Cookie 窃贼窃取。

但是,它不会:

  • 不指定数据的存储。开发者完全负责用户如何加载。

  • 限制您使用用户名和密码、OpenID 或任何其他方法 的身份验证。

  • 处理“登录与否”之外的权限,也就是只是登录,没有权限认证相关的。

  • 处理用户注册或帐户恢复,不会自动删除用户或恢复佣金。

二、安装

pip install flask-login

三、快速入门

创建登录管理器

from flask_login import LoginManager
login_manager = LoginManager()

登录管理器包含允许您的应用程序和 Flask-Login 的代码 协同工作,例如如何从 ID 加载用户,何时将用户发送到何处 他们需要登录,等等。
创建实际应用程序对象后,可以对其进行配置 登录方式:

login_manager.init_app(app)

3.1 后端

# 导入falsk
import flask_login
from flask import Flask, render_template, jsonify, redirect, request, url_for
from flask_bootstrap import Bootstrap5
from flask_login import LoginManager, login_user, UserMixin, current_user, login_required, logout_user
from flask_wtf import FlaskForm
from werkzeug.security import check_password_hash, generate_password_hash
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired

login_manager = LoginManager()

# 通过导入的falsk,创建一个app
app = Flask(__name__)
app.secret_key = "16623b4eb38efb00f2b8e7f5359f80d1826caf0c77506856e1e12cfc53b0dc83"
bootstrap = Bootstrap5(app)
login_manager.init_app(app)

# 模拟的用户信息
USERS = [
    {
        "id"1,
        "name"'zhangsan',
        "password": generate_password_hash('123')
    },
    {
        "id"2,
        "name"'lisi',
        "password": generate_password_hash('123')
    }
]


# 用户从模拟用户信息中,得到用户信息,该方法用于从哪里获取用户数据,可以是数据库,也可以是配置文件等
def get_user(user_name):
    """根据用户名获得用户记录"""
    for user in USERS:
        if user.get("name") == user_name:
            return user
    return None


# 定义一个用户类,这个类是用于记录登录人信息的
class User(UserMixin):
    """用户类"""

    def __init__(self, user):
        self.username = user.get("name")
        self.password_hash = user.get("password")
        self.id = user.get("id")

    def verify_password(self, password):
        """密码验证"""
        if self.password_hash is None:
            return False
        return check_password_hash(self.password_hash, password)

    def get_id(self):
        """获取用户ID"""
        return self.id

    @staticmethod
    def get(user_id):
        """根据用户ID获取用户实体,为 login_user 方法提供支持"""
        if not user_id:
            return None
        for user in USERS:
            if user.get('id') == user_id:
                return User(user)
        return None


# 自定义表单
class MyLoginForm(FlaskForm):
    username = StringField('用户', validators=[DataRequired()])
    password = PasswordField('密码', validators=[DataRequired()])
    submit = SubmitField("登录")


# 登录方法
@app.route('/login/', methods=['GET', 'POST'])
def login():
    form = MyLoginForm()
    errmsg = None
    if form.validate_on_submit():
        user_name = form.username.data
        password = form.password.data
        # 根据用户名密码查询具体的用户信息
        user_info = get_user(user_name)
        print(user_name, password)
        if user_info is None:
            errmsg = "用户名或密码密码错误"
        else:
            user = User(user_info)  # 创建用户实体
            if user.verify_password(password):  # 校验密码
                login_user(user)  # 创建用户 Session
                return redirect(request.args.get('next'or url_for('index'))
            else:
                errmsg = "用户名或密码密码错误"
    return render_template('login.html', form=form, errmsg=errmsg)


# 加载登录人信息的方法
@login_manager.user_loader
def load_user(user_id):
    return User.get(user_id)


# 首页
@app.route("/index/")
def index():
    # 获取登录用户信息
    return render_template('index.html', username=current_user.username)


# 登出
@app.route('/logout/')
@login_required
def logout():
    # 调用flask的登出
    logout_user()
    return redirect(url_for('login'))


# 开启运行
if __name__ == '__main__':
    app.run(debug=True)
    """
    debug,是否开启调试模式,开启后,重新启动程序,当再次修改Python代码后,会立即启动
    port,启动指定服务器的端口号,默认是5000
    host,主机,默认是127.0.0.1;如果指定0.0.0.0代表本机的所以IP    
    """

3.2 登录模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    {{ bootstrap.load_css() }}
</head>
<body>
<!-- 如果有错误,就显示 -->
{% if errmsg %}
    <h3> {{ errmsg }}</h3>
{% endif %}

{% from 'bootstrap5/form.html' import render_form %}

{{ render_form(form,form_type='basic') }}
{{ bootstrap.load_js() }}
</body>
</html>

3.3 首页模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    {{ bootstrap.load_css() }}
</head>
<body>
<h2>当前登录人是{{ username }}</h2>
<a href="/logout/">登出</a>
{{ bootstrap.load_js() }}
</body>
</html>


原文始发于微信公众号(Python之家):Flask-14-登录认证

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198239.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!