Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Flask框架中request、请求钩子、上下文用法分析

Flask框架中request、请求钩子、上下文用法分析

作者头像
Python之道
发布于 2020-06-02 07:15:59
发布于 2020-06-02 07:15:59
8540
举报
文章被收录于专栏:程序员八阿哥程序员八阿哥

flask

更新时间:2019年07月23日 09:33:25 转载 作者:笑-笑-生

这篇文章主要介绍了Flask框架中request、请求钩子、上下文用法,结合实例形式分析了flask框架中request、请求钩子及上下文的功能、用法及相关操作注意事项,需要的朋友可以参考下

本文实例讲述了Flask框架中request、请求钩子、上下文用法。分享给大家供大家参考,具体如下:

request

就是flask中代表当前请求的request对象:

常用的属性如下:

| 属性 | 说明 | 类型 | | data | 记录请求的数据,并转换为字符串 | * | | form | 记录请求中的表单数据 | MultiDict | | args | 记录请求中的查询参数 | MultiDict | | cookies | 记录请求中的cookie信息 | Dict | | headers | 记录请求中的报文头 | EnvironHeaders | | method | 记录请求使用的HTTP方法 | GET/POST | | url | 记录请求的URL地址 | string | | files | 记录请求上传的文件 | * |

请求勾子

flask的请求钩子其实跟django的中间件很类似。

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接;在请求结束时,指定数据的交互格式。为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设施的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

  • before_first_request:在处理第一个请求前运行。
  • before_request:在每次请求前运行。
  • after_request:如果没有未处理的异常抛出,在每次请求后运行。
  • teardown_request:在每次请求后运行,即使有未处理的异常抛出。

装饰器路由的实现

Flask有两大核心:Werkzeug和Jinja2

  • Werkzeug实现路由、调试和Web服务器网关接口
  • Jinja2实现了模板。

Werkzeug是一个遵循WSGI协议的python函数库

  • 其内部实现了很多Web框架底层的东西,比如request和response对象;
  • 与WSGI规范的兼容;支持Unicode;
  • 支持基本的会话管理和签名Cookie;
  • 集成URL请求路由等。

Werkzeug库的routing模块负责实现URL解析。不同的URL对应不同的视图函数,routing模块会对请求信息的URL进行解析,匹配到URL对应的视图函数,以此生成一个响应信息。

routing模块内部有:

  • Rule类(用来构造不同的URL模式的对象)
  • Map类(存储所有的URL规则)
  • BaseConverter的子类(负责定义匹配规则)
  • MapAdapter类(负责具体URL匹配的工作)

上下文

上下文:相当于一个容器,保存了Flask程序运行过程中的一些信息。

Flask中有两种上下文,请求上下文和应用上下文。

请求上下文(request context)

Flask从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象是一个很好的例子,它封装了客户端发送的HTTP请求。

要想让视图函数能够访问请求对象,一个显而易见的方式是将其作为参数传入视图函数,不过这会导致程序中的每个视图函数都增加一个参数,除了访问请求对象,如果视图函数在处理请求时还要访问其他对象,情况会变得更糟。为了避免大量可有可无的参数把视图函数弄得一团糟,Flask使用上下文临时把某些对象变为全局可访问。

  • request 和 session 都属于请求上下文对象。
    • request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
    • session:用来记录请求会话中的信息,针对的是用户信息。举例:session['name'] = user.id,可以记录用户信息。还可以通过session.get('name')获取用户信息。
  • 当调用app = Flask(name)的时候,创建了程序应用对象app;
  • request 在每次http请求发生时,WSGI server调Flask.call();然后在Flask内部创建的request对象;
  • app的生命周期大于request,一个app存活期间,可能发生多次http请求,所以就会有多个request。
  • 最终传入视图函数,通过return、redirect或render_template生成response对象,返回给客户端。

应用上下文(application context)

它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。

应用上下文对象有:current_app,g

current_app

应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量,例如:

  • 应用的启动脚本是哪个文件,启动时指定了哪些参数
  • 加载了哪些配置文件,导入了哪些配置
  • 连了哪个数据库
  • 有哪些public的工具类、常量
  • 应用跑再哪个机器上,IP多少,内存多大

current_app.name

current_app.test_value``=``'value'

g变量

g作为flask程序全局的一个临时变量,充当者中间媒介的作用,我们可以通过它传递一些数据,g保存的是当前请求的全局变量,不同的请求会有不同的全局变量,通过不同的thread id区别

g.name``=``'abc'

两者区别:

请求上下文:保存了客户端和服务器交互的数据 应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等

希望本文所述对大家基于flask框架的Python程序设计有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
10.Flask上下文
 应用上下文和请求上下文都是存放在一个‘LocalStack’的栈中,和应用app相关的操作就必须要用到应用上下文,比如通过current_app获取当前的这个app的名字。和请求相关的操作就必须用到请求上下文,比如使用url_for反转视图函数。
zhang_derek
2018/08/01
3360
详解Flask上下文
在Flask中,对一个请求进行处理时,视图函数一般都会需要请求参数、配置等对象,当然不能对每个请求都传参一层层到视图函数(这显然很不优雅嘛),为此,设计出了上下文机制(比如像我们经常会调用的request就是上下文变量)。
oYabea
2020/09/07
9180
Flask 的上下文对象
request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get('user'),获取的是get请求的参数。
Devops海洋的渔夫
2019/12/16
3380
Flask的请求钩子与上下文简记
Flask的请求钩子通过装饰器实现,每个钩子可以注册任意多个处理函数,默认的五种请求钩子如下:
Cloud-Cloudys
2020/07/07
7670
Python Flask 编程 | 连载 03 - Flask 请求
应用上下文对象有两个,分别是 current_app 表示当前应用的实例以及 g 表示处理请求时临时存储对象,每次请求都会重设这个变量,并且 g 对象时线程隔离的,使用g对象需要导入,g 既 global。
RiemannHypothesis
2022/09/26
3790
Python Flask 编程 | 连载 03 - Flask 请求
Flask入门很轻松 (二)
转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959454.html
py3study
2020/01/15
4120
小白学Flask第八天| Flask上下文和请求钩子
在这篇文章之前,我们学习过request和session这两个小家伙,他们两的功能都非常的强大,我们今天讲上下文对象,也是和他们两有着很大的关系。
Python进击者
2019/09/17
6340
Flask 学习-64.current_app的使用与应用上下文(AppContext)
前言 在很多框架里面都提到一个词:上下文(Context),比如django里面的request 就是一个请求上下文对象。 flask 里面 current_app 用于获取应用app对象。 上下文(Context) 什么是上下文(Context) 维持一段程序正常运行的所需要的外部变量的值的集合,叫做上下文(context)。 详细描述: 每一段程序都有很多外部变量。只有像Add这种简单的函数才是没有外部变量的。 一旦你的一段程序有了外部变量,这段程序就不能独立完整的运行。 你为了使他们运行,就要给所有的
上海-悠悠
2022/09/19
2.7K0
Flask 学习-64.current_app的使用与应用上下文(AppContext)
flask系列八之请求方法、g对象和钩子函数
(2)在写form表单的时候,要指定method='post',并且要指定action='/login/'。
wfaceboss
2019/04/08
5380
Flask 中的上下文管理和请求钩子
在使用 Flask 框架实现功能接口的时候,前端点击按钮发送请求的请求方式和 form 表单提交给后端的数据,后端都是通过 Flask 中的 request 对象来获取的。
Python碎片公众号
2021/02/26
1.8K0
Flask 中的上下文管理和请求钩子
Python Web Flask源码解读(四)——全局变量
Flask中全局变量有current_app、request、g和session。不过需要注意的是虽然标题是写着全局变量,但实际上这些变量都跟当前请求的上下文环境有关,下面一起来看看。
阳仔
2019/08/23
3.4K0
【Flask】FlaskWeb开发上手点滴(01)-入门
首先从flask初始化的一个例子说起。 打开pyCharm新建一个Flask的项目之后,会初始化一个Flask的程序目录(假设创建一个名为flaskblog的项目)。首先来看flaskblog.py这个文件里的代码: (包含注释)
前端修罗场
2023/10/07
2760
Flask项目搭建及部署(完整版!全网最全)
由于flask属于轻量级web框架, 更加自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的Python库 。所以这个框架的代码架构需要自己设计。
用户7886150
2020/12/31
4.8K0
Flask 程序的基本结构
1、初始化   所有Flask程序都必须创建一个程序实例。web服务器使用一种名为Web服务器网关借口的协议,把接收自客户端的所有请求都转交给这个对象处理。 from flask import Flask app = Flask(__name__)   Flask类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。 2、路由和视图函数 客户端把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例。程序实例需要知道对每个URL请求运行哪些代码,所以保存了一个URL到Python函数的映
用户1173509
2018/01/17
1.1K0
Flask 程序的基本结构
flask框架(二)
设置cookie:response.set_cookie(key,value,max_age)
小闫同学啊
2019/07/18
1.2K0
flask框架(二)
Flask 入门系列教程(二)
本节,我们先从一道经典的面试题目开始:当你在浏览器中输入一个 URL 并按下 Enter 后,都发生了什么?
周萝卜
2020/09/18
1.2K0
Flask(三)之请求上下文源码分析
run_simple是werkzeug内部的方法,在run_simple执行时会将app加括号调用从而执行app的__call__方法,来看__call__源码:
GH
2020/03/19
3850
Flask 上下文详解
上下文相当于一个容器,保存了 Flask 程序运行过程中的一些信息。Flask 中有两种上下文,请求上下文(request 和 session )和应用上下文(current_app和g)。
Wu_Candy
2022/07/04
3680
一线Python运维开发带你秒懂Flask框架
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
小小科
2019/06/28
9250
flask框架2_flask框架介绍
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179055.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/27
7640
flask框架2_flask框架介绍
相关推荐
10.Flask上下文
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档