使用 Flask 的g对象和 MySQL 实现用户登录和注销功能

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 使用 Flask 的g对象和 MySQL 实现用户登录和注销功能

Flask中,g对象是一个特殊类型的对象,被称为"上下文全局变量"。它在一次请求的生命周期内存储信息,并且可以在整个请求过程中访问和共享。



g对象对于存储用户登录信息非常有用。例如,当用户通过验证登录时,您可以将用户的身份信息存储在g.user中,以便在当前请求的其他部分使用。这样,在请求的其他函数、方法或视图中,您可以轻松地访问和验证用户的登录状态,而无需在每个函数中重复验证。


通过在g对象中存储用户的登录信息,您可以确保在请求的整个处理过程中使用相同的用户信息,而无需重复查询数据库或将信息传递给每个函数。这提供了一种方便的方式来访问和共享请求范围的数据,使您能够轻松地处理用户身份验证和授权等功能。


下面是如何在 Flask 中使用 g 对象来保存、访问用户登录信息以及注销登录的示例代码:

首先,假设我们有一个 UserModel 表在 MySQL 数据库中,且已经建立了一个 SQLAlchemy 模型来与之交互。


from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class UserModel(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, nullable=False)
    password = db.Column(db.String(128), nullable=False)

该代码为Flask应用程序中的用户模型设置了基本结构,包括用户的ID、用户名和密码。SQLAlchemy将处理Python类与相应数据库表之间的映射,允许您使用UserModel类执行数据库操作。



用户登录并保存登录状态


接着我们在 Flask 应用中使用 g 对象和 before_request 钩子函数来保存用户登录信息:

from flask import Flask, g, session, abort
from flask_login import LoginManager, login_user
from flask_migrate import Migrate
# 初始化 Flask 应用
app = Flask(__name__)
# 初始化
migrate = Migrate(app, db)
db.init_app(app)
@app.before_request
def my_before_request():
    user_id = session.get("user_id")
    if user_id:
        user = UserModel.query.get(user_id)
        setattr(g, "user", user)
    else:
        setattr(g, "user", None)
@app.context_processor
def my_context_processor():
    return {"user": g.user}


第一个函数 my_before_request 使用 @app.before_request 装饰器进行修饰。这意味着它将在每次请求之前执行。该函数的目的是在会话中检查是否存在 “user_id” 键,并根据该键的值来设置全局对象 g 的 “user” 属性。具体来说,它从会话中获取 “user_id” 的值,然后使用该值查询数据库中的 UserModel 表,获取对应的用户对象,并将该对象设置为 g.user。如果 “user_id” 不存在或对应的用户对象未找到,则将 g.user 设置为 None。


第二个函数 my_context_processor 使用 @app.context_processor 装饰器进行修饰。这意味着它将注册为一个上下文处理器,用于在模板中设置全局变量。该函数返回一个字典,其中键为 “user”,值为 g.user。这样,在渲染模板时,就可以在模板中使用 user 变量来访问当前用户的信息。


总结起来,这段代码的作用是在每次请求之前检查会话中的用户ID,查询数据库获取用户对象,并将用户对象设置为全局变量,以便在模板中使用。这样,在渲染模板时,就可以方便地获取当前用户的信息。




然后写登录的实现路由

@app.route("/login", methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template("login.html")
    else:
        username = form.username.data
        password = form.password.data
        #表单登录验证
        user = UserModel.query.filter_by(username=username).first()
        if not user:
            return redirect(url_for("auth.login"))
        if user.password==password:
            session['user_id'] = user.id
            #添加user_id到session中
            return redirect("/")
        else:
            return render_template('pwd_error.html')



退出登录状态


在 Flask 中,你可以通过从 session 中删除用户 ID 来实现用户的注销。下面是一个简单的注销路由的示例:

from flask import redirect, url_for
@app.route("/logout")
def logout():
    session.clear()
    return redirect("/")


这个注销路由首先从 session 中删除了 ‘user_id’。然后路由重定向到了首页。


注意,你还需要确保在用户登出后,不能再通过更改浏览器的 user_id cookie 来伪装为已注销的用户。这通常通过将 session 的 secure 属性设置为 True 来实现,这样 cookie 就只能在 HTTPS 连接中传输。同时,将 session 的 httponly 属性设置为 True 可以阻止 JavaScript 访问到 cookie,这样可以避免跨站脚本(XSS)攻击。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
搜索推荐 数据可视化 数据挖掘
基于Python flask框架的招聘数据分析推荐系统,有数据推荐和可视化功能
本文介绍了一个基于Python Flask框架的招聘数据分析推荐系统,该系统具备用户登录注册、数据库连接查询、首页推荐、职位与城市分析、公司性质分析、职位需求分析、用户信息管理以及数据可视化等功能,旨在提高求职者的就业效率和满意度,同时为企业提供人才匹配和招聘效果评估手段。
110 0
基于Python flask框架的招聘数据分析推荐系统,有数据推荐和可视化功能
|
4月前
|
自然语言处理 关系型数据库 MySQL
mysql 全文搜索功能优缺点
mysql 全文搜索功能优缺点
|
24天前
|
程序员 API 数据库
Django/Flask深度揭秘:揭秘那些让程序员爱不释手的神奇功能!
在Web开发领域,Django与Flask凭借其独特魅力和强大功能深受程序员喜爱。Django作为全能型框架,以其ORM、模板引擎和丰富的内置功能著称;Flask则以轻量级、灵活的路由系统和强大的扩展生态见长。两者各具特色,为开发者提供了高效、灵活的开发工具。
39 4
|
1月前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
38 0
|
3月前
|
安全 数据安全/隐私保护 Python
基于Flask框架实现一个简易后台用户登录系统
基于Flask框架实现一个简易后台用户登录系统
|
3月前
|
人工智能 安全 数据安全/隐私保护
基于Flask框架实现一个简易后台用户登录系统
基于Flask框架实现一个简易后台用户登录系统
|
4月前
|
数据采集 数据可视化 关系型数据库
基于Python flask MySQL 猫眼电影可视化系统设计与实现
本文介绍了一个基于Python Flask框架、MySQL数据库和Layui前端框架的猫眼电影数据采集分析与可视化系统,该系统通过爬虫技术获取数据,利用Python开源数据分析库处理数据,并使用Echart可视化工具展示统计图表,旨在提供对电影市场情况和趋势的深入了解。
基于Python flask MySQL 猫眼电影可视化系统设计与实现
|
4月前
|
存储 关系型数据库 MySQL
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
本文介绍了一个基于Python Django框架开发的医院管理系统,该系统设计了管理员、用户和医生三个角色,具备多用户功能,并使用MySQL数据库进行数据存储和管理。
155 4
基于python django 医院管理系统,多用户功能,包括管理员、用户、医生,数据库MySQL
|
4月前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
72 3
|
4月前
|
前端开发 数据挖掘 关系型数据库
基于Python的哔哩哔哩数据分析系统设计实现过程,技术使用flask、MySQL、echarts,前端使用Layui
本文介绍了一个基于Python的哔哩哔哩数据分析系统,该系统使用Flask框架、MySQL数据库、echarts数据可视化技术和Layui前端框架,旨在提取和分析哔哩哔哩用户行为数据,为平台运营和内容生产提供科学依据。
244 9