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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 使用 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)攻击。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 关系型数据库 数据库
|
1月前
|
前端开发 关系型数据库 数据库
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
51 0
|
6天前
|
JSON 关系型数据库 MySQL
理解和利用MySQL中的JSON功能
理解和利用MySQL中的JSON功能
30 2
|
7天前
|
JSON API 数据格式
如何使用Flask request对象处理请求
在 Flask 中,request对象是处理 HTTP 请求的重要工具之一。它提供了许多属性和方法,可以帮助我们获取请求的相关信息和数据。本文将向你介绍request对象的常用方法以及如何在 Flask 应用程序中使用它。
16 3
|
8天前
|
前端开发 关系型数据库 MySQL
使用 PHP 和 MySQL 实现留言板功能
使用 PHP 和 MySQL 实现留言板功能
17 0
|
11天前
|
SQL 安全 关系型数据库
精通MySQL:核心功能、性能优化与安全管理
h3> 第一章:MySQL入门 1.1 MySQL概述 介绍MySQL的历史、版本发展及其在当前数据库领域的重要地位
|
11天前
|
存储 关系型数据库 MySQL
精通MySQL:核心功能与实践应用
h3> 第一章:MySQL入门 1.1 MySQL概述 简要介绍MySQL的历史、特点以及在数据库领域的应用
|
12天前
|
SQL 存储 关系型数据库
AI代码提示工具可用于教学功能示例——MySQL
AI代码提示工具可用于教学功能示例——MySQL
15 0
|
1月前
|
SQL 存储 关系型数据库
实时数仓 Hologres产品使用合集之有没有MySQL那样的AUTOINCREMENT字段来实现自增ID功能
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
118 5
|
19天前
|
SQL 关系型数据库 MySQL
MySQL中insertOrUpdate的功能如何实现的
MySQL中的`INSERT INTO ... ON DUPLICATE KEY UPDATE`语句实现insertOrUpdate功能,当遇到重复键时,会更新已有记录。该操作需要表有主键或唯一索引,且冲突时加临时键锁可能引发死锁。例如,向student表插入数据,如果id已存在则更新name和age。底层实现包括检查唯一索引、处理冲突和执行更新。类似语句有REPLACE INTO和INSERT IGNORE INTO。在主键冲突更新时,自增主键计数器仍会增加,即使未实际插入新记录。