Flask笔记二之blueprint和session介绍

本文首发于公众号:Hunter后端

原文链接:Flask笔记二之blueprint和session介绍

前面我们使用 @app.route() 的方式实现了一个简单的接口,用于访问系统接口,接下来介绍一下如何使用 Blueprint 来实现路由的分组以及 Flasksession 的使用。

本篇笔记的代码都已经提交到 github 上,可使用下面的操作获取代码:

git clone https://github.com/x1204604036/flask_backend.git

1、Blueprint 介绍和使用

Blueprint 的使用主要有两步,一步是定义,一步是注册。

下面我们用一个实例来介绍如何使用,比如我们这里使用用户登录验证的接口来操作。

我们在 app/ 文件夹下创建一个名为 user 的文件夹,在其下再创建一个名为 bp_user.py 文件,其内容如下:

# app/user/bp_user.pyfrom flask import Blueprint, requestbp = Blueprint("user", __name__, url_prefix="/user")@bp.route("/login", methods=("POST", "GET"))
def login():# username = request.form["username"]# password = request.form["password"]return {"code": 0, "msg": "success"}

这里,我们实例化了 Blueprint,定义一个 bp,然后使用 @bp.route() 的方式定义路由和可以调用的方法,比如 GET,比如 POST

在 login() 函数内部可以进行我们必要的一些逻辑处理,比如用户名密码进行验证操作。

然后需要将其在 app/__init__.py 中注册:

# app/__init__.pyfrom flask import Flaskdef create_app():app = Flask(__name__)from .user import bp_userapp.register_blueprint(bp_user.bp)return app

然后运行我们的系统:

flask run

然后可以使用 postman 来进行 POST 请求测试。

以上就是 Blueprint 的基本使用方法示例。

2、request 请求数据获取

接下来介绍一下 flask 里 request 请求数据的获取

0. 请求方式获取

判断请求类型是什么可以直接使用 request.method,引入方式为:

from flask import request

判断请求类型:

if request.method == "GET":print("GET 请求")
elif request.method == "POST":print("POST 请求")
1. GET 参数获取

使用 request.args.get() 的方式可以获取 GET 请求的参数,比如我们的请求 api 是 /user/login?username=admin&password=123456
可以这样获取:

if request.method == "GET":username = request.args.get("username")password = request.args.get("password")
2. POST 表单数据

如果我们是使用 POST 请求的表单数据请求的,我们需要使用 request.form 的方式获取数据:

if request.method == "POST":username = request.form.get("username")password = request.form.get("password")
3. POST json 数据

如果是使用 POST 放到 json 里传输的,可以使用 request.get_json() 方法获取全部数据:

if request.method == "POST":request_json = request.get_json()username = request_json.get("username")password = request_json.get("password")

3、session 会话操作

接下来介绍一下在 Flask 中使用 session 会话。

这个逻辑大概有三个接口,

第一个接口是登录接口,根据传进来的用户名和密码进行验证登录操作,并将登录信息写入 session

第二个接口是用户信息接口,这个接口需要登录之后才可访问,逻辑是在获取用户信息之前 session 中是否有登录信息

第三个接口是登出接口,也就是注销接口,删除 session 中的登录信息

因为这里还没有介绍数据库的使用,所以接下来示例的检验操作都忽略,直接获取验证结果。

session 的使用介绍

session 通过下面的方式引入:

from flask import session

进行 session 的操作和之前 Django 里对 session 的操作类似,我们可以将 user_id 的信息写入 session,用户访问某些需要登录之后才允许访问的接口时,需要先读取 session 信息

# 将 user_id 写入 session
session["user_id"] = user_id 

session 的清除处理:

session.clear()

下面介绍三个接口的示例

在使用 session 之前,需要设置密钥

我们在 app/init.py 中设置:

app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

secret_key 的值生成方式可以通过下面的操作获取:

python3 -c 'import secrets; print(secrets.token_hex())'

登录接口

@bp.route("/login", methods=("POST",))
def login():# username = request.form["username"]# password = request.form["password"]# 验证用户名和密码user_id = 1  # 进行用户名和密码验证,去数据库查询获取 user_id 信息if user_id:session.clear()session["user_id"] = user_idelse:return {"code": -1, "msg": "用户名或密码错误"}return {"code": 0, "msg": "success"}

登出接口

@bp.route("/logout", methods=("POST",))
def logout():session.clear()return {"code": 0, "msg": "logout success"}

下面定义一个获取用户信息的接口,这个接口需要设置成的逻辑是需要登录之后才可以访问接口,这里我们可以先设置一个装饰器,然后再加到接口逻辑上:

def login_required(func):def wrapped(*args, **kwargs):if session.get("user_id") is None:return {"code": -1, "msg": "请先登录系统"}return func(*args, **kwargs)return wrapped@bp.route("/user_info", methods=("POST",))
@login_required
def get_user_info():user_id = session.get("user_id")user_info = {"user_id": user_id}  # get user info from dbreturn {"code": 0, "msg": "success", "user_info": user_info}

这个 session 操作相当于是直接将用户信息写入 cookie,之后我们可以尝试将其写入 Redis。

关于这个访问需要登录的设置,后续学习了中间件的操作之后,我们可以直接使用中间件的方式来进行登录访问限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/157087.shtml

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

相关文章

Modbus转Profinet网关在大型自动化仓储项目应用案例

Modbus转Profinet网关在大型自动化仓储项目应用案例 在自动化仓储项目中,Modbus是一种常见的通信协议,用于连接各种设备,例如传感器、PLC和人机界面。然而,Modbus协议只支持串行通信,并且数据传输速度较慢。为了提高通…

【C++历练之路】stack||queue||底层原理知多少

W...Y的主页 😊 代码仓库分享💕 🍔前言: C标准模板库(Standard Template Library,STL)是C语言的一个重要组成部分,提供了一组通用的数据结构和算法,以便开发人员能够高…

计算机算法分析与设计(24)---分支限界章节复习

文章目录 一、分支界限法介绍二、旅行商问题应用三、装载问题应用3.1 问题介绍与分析3.2 例题 四、0-1背包问题应用4.1 问题介绍与分析4.2 例题 一、分支界限法介绍 二、旅行商问题应用 三、装载问题应用 3.1 问题介绍与分析 3.2 例题 四、0-1背包问题应用 4.1 问题介绍与分析…

java 数据库 查询 select 2

Day2 组函数 以组为操作单位,一组数据得到一个结果。 在没有手动分组的前提下,整张表默认为一组数据 max(列名):获取最大值 min(列名):获取最小值 sum(列名):获取总和 avg(列名):获取平均值 count(列…

TensorFlow实战教程(十九)-Keras搭建循环神经网络分类案例及RNN原理详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。这篇文章将详细讲解循环神经网络RNN的原理知识,并采用Keras实现手写数字识别的RNN分类案例及可视化呈现。基础性文…

【C++进阶之路】第十篇:C++的类型转换

文章目录 1.C语言中的类型转换2.为什么C需要四种类型转换3.C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast 4.RTTI(了解)5.常见面试题 1.C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同&…

CSDN专栏设置

文章目录 一、规则1.1、专栏数量与等级关联1.2、等级与积分关联1.3、积分1.3.1、积分获取1.3.2、积分被扣 二、配置2.1、入口2.2、新建2.2.1、一级专栏2.2.2、二级专栏 2.3、快捷编辑2.4、拖拽 一、规则 写了一阵子CSDN博客后,发现自己新增专栏的时候提示不能再新增…

oracle 杀掉正在“执行”的SQL

1、 找到正在执行的 SQL,或者造成等待事件的SQL 的 sid 和 serial#,通过这两个值确定一个 session SELECT b.username 用户名,b.sid, session_idb.serial#, 串口号spid 操作系统ID,paddr, session对应的进程地址,sql_text 正…

【python笔记】客户运营 - cohort分析

一、数据 本文涉及数据下载链接。 二、数据预处理 2.1 读取数据 import pandas as pddf pd.read_csv(your_path/Year 2010-2011.csv, encodingISO-8859-1) df.head()2.2 检查数据 检查空值情况 df.isna().sum() # 结果 Invoice 0 StockCode 0 De…

二叉树的层序遍历

1 问题 二叉树是计算机科学中非常基础且重要的数据结构,它由节点和连接它们的边组成。其中一个节点为根节点,除此之外其他的节点都有唯一一个父节点。层序遍历是二叉树遍历的一种,也是最常见的一种遍历方法。它是按照二叉树的深度&#xff0c…

大数据-之LibrA数据库系统告警处理(ALM-25005 Nscd服务异常)

告警解释 系统每60秒周期性检测nscd服务的状态,如果连续4次(3分钟)查询不到nscd进程或者无法获取ldapserver中的用户时,产生该告警。 当进程恢复且可以获取ldapserver中的用户时,告警恢复。 告警属性 告警ID 告警级…

visionOS空间计算实战开发教程Day 2 使用RealityKit显示3D素材

我们在​​Day1​​中学习了如何创建一个visionOS应用,但在第一个Demo应用中我们的界面内容还是2D的,看起来和其它应用并没有什么区别。接下来我们先学习如何展示3D素材,苹果为方便开发人员,推出了RealityKit,接下来看…

Vue 3实战:打造交互丰富的任务管理应用

Vue 3实战:打造交互丰富的任务管理应用 前言搭建Vue 3项目步骤 1: 安装Vue CLI 3步骤 2: 创建Vue 3项目步骤 3: 进入项目目录步骤 4: 启动项目步骤 5: 查看项目结构 组件设计与复用1. **组件的职责单一化:**2. **Props传递:**3. **插槽(Slots&#xff09…

MongoDB——文档增删改查命令使用

MongoDB 文档增删改查 命令操作描述db.collection.insert() db.collection.insert()将单个文档或多个文档插入到集合中db.collection.insertOne()插入文档,3.2 版中的新功能db.collection.insertMany()插入多个文档,3.2 版中的新功能db.collection.update更新或替…

目标检测YOLO实战应用案例100讲-基于改进YOLOv5s的道路目标检测(续)

目录 3.3融合注意力模块 3.3.1注意力机制 3.3.2 SENet 3.3.3 CBAM 3.3.4ECA 3.3.5改进后的算法网络结构

维格表项目进度同步到钉钉群

企业越来越依赖项目管理工具,以确保项目按时完成、成本控制得当、并实现预期的业务目标。但随着项目变得更加复杂,项目经理和团队需要更高效的方法来跟踪和传达项目进度,以确保团队内部保持一致的理解。 传统的项目管理方法,可能缺…

『亚马逊云科技产品测评』活动征文|搭建Squoosh图片在线压缩工具

搭建Squoosh图片在线压缩工具 前言一、Squoosh是什么?二、准备一台Lightsail实例1.进入控制台2.创建实例3.开放端口4.部署Squoosh5.预览 三、搭建反向代理1. 安装宝塔2. 配置反向代理3. 预览代理效果 提示:授权声明:本篇文章授权活动官方亚马…

【前端】vue中合并表格行

做平台功能时&#xff0c;遇到一个需求是需要将表格某列有相同值时进行合并展示&#xff0c;比如 1、通过在Element中得知需要在表格中增加span-method方法 <el-table:data"tableData":span-method"cellMerge"borderstyle"width: 100%; margin-to…

mysql8.0英文OCP考试第61-70题

Q61.You wish to protect your MySQL database against SQL injection attacks. Which method would fail to do this? A)using stored procedures for any database access B)using PREPARED STATEMENTS C)installing and configuring the Connection Control plugin ( …

苍穹外卖遇到的问题—员工分页查询

项目场景&#xff1a; 系统中的员工很多的时候&#xff0c;如果在一个页面中全部展示出来会显得比较乱&#xff0c;不便于查看&#xff0c;所以一般的系统中都会以分页的方式来展示列表数据。而在我们的分页查询页面中, 除了分页条件以外&#xff0c;还有一个查询条件 “员工姓…