Flask从入门到精通(二)

一、程序上下文

Flask接收到来自客户端的请求后,路由到指定的接口进行响应处理并返回处理结果。响应接口需要知道客户端的请求体,即request对象才能进行正确的处理。如果给每个接口函数都传递一个request对象参数,太过冗余,且代码会很难看,因此Flask使用上下文临时将某些对象编程线程内的全局变量,即在同一个线程内,上下文信息可全局共享,且不会干扰到其他的线程环境。

Flask有两种上下文,分别为程序上下文和请求上下文,各自对应的全局变量如下表:

变量名 上下文 备注
current_app 程序上下文 表示当前运行的程序实例
g 程序上下文 处理请求时用作临时存储对象,每次请求都会重新设值
request 请求上下文 客户端发来的request请求对象
session 请求上下文 请求携带的会话信息

Flask在分发请求之前会激活上下文信息,在请求处理完成后再删除。上下文只有在激活后,才可使用对应的全局变量,否则会报异常。

app_ctx = app.app_context()    #可获取app对应的上下文

app_ctx.push()  #推送上下文信息,即激活上下文

二、请求钩子

有时候,在请求开始或结束后,我们可能想要执行一些代码,比如,在请求开始前,完成数据库的连接,用户信息的认证等等。Flask使用装饰器为我们提供了注册通用函数的功能,支持的钩子函数有以下四种:

before_first_request 第一次请求之前调用
before_request 每次请求之前调用
after_request 每次请求之后调用,前提是没有未处理的异常抛出
teardown_request 每次请求之后调用,即使有未处理的异常抛出

在请求函数和钩子函数之间,一般通过全局变量g实现数据共享。

三、响应

Flask的响应一般可包含三个参数,第一个参数指明响应的字符串,第二个参数可指明响应状态码,如200表示响应成功,第三个参数是由header首部组成的字典。我们可以通过make_response()生成一个response对象并设置。

 1 #!/usr/bin/env python
 2 # encoding: utf-8
 3 from flask import Flask
 4 from flask import request
 5
 6 app = Flask(__name__)
 7
 8
 9 @app.route(‘/‘)
10 def hello_world():
11     return ‘Hello World!‘
12
13
14 @app.route("/user/<user_name>")
15 def hello_user(user_name):
16     """
17      动态路由示例
18     :param user_name: 用户名
19     :return:
20     """
21     1/0
22     return "Hello %s" % user_name
23
24
25 @app.route("/context")
26 def get_context():
27     """
28      获取请求的上下文信息
29     :return:
30     """
31     user_agent = request.headers.get("user-agent")
32     return "your user-agent is %s" % user_agent
33
34
35 @app.before_first_request
36 def first_quest():
37     print "run before first request"
38
39
40 @app.before_request
41 def every_request():
42     print "One new request is comming"
43
44
45 @app.after_request
46 def after_r(exception):
47     print "The request has done 1"
48
49 @app.teardown_request
50 def teardown_r(exception):
51     print "The request has done 2"
52
53
54 if __name__ == ‘__main__‘:
55     app.run()

上述代码运行后,在浏览器分别请求

http://127.0.0.1:5000/ 输出:

run before first request

    One new request is comming
   The request has done 1
   The request has done 2

http://127.0.0.1:5000/user/patty 输出:

One new request is comming
   The request has done 2

变量共享:通过g实现

1 @app.route(‘/‘)
2 def hello_world():
3     print g.user
4     return ‘Hello World!‘
5
6 @app.before_first_request
7 def first_quest():
8     g.user = ‘tmp‘
9     print "run before first request"
时间: 2024-10-25 13:29:04

Flask从入门到精通(二)的相关文章

iOS开发-UI 从入门到精通(二)

iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI开发我们需要手动管理内存,所以我们要把ARC关掉(Xcode关掉ARC的步骤): (1)打开Xcode选中当前工程: (2)选中Build Settings: (3)在输入框内输入count: (4)选择Objective-C Automatic Reference Counting  将其设置为 

Python基本语法,python入门到精通[二]

在上一篇博客Windows搭建python开发环境,python入门到精通[一]我们已经在自己的windows电脑上搭建好了python的开发环境,这篇博客呢我就开始学习一下Python的基本语法.现在练习的开发环境是基于windows的,如果有朋友喜欢linux或者mac的话,只要有需求,我后续的可以给出对应的博文介绍,其实也是换汤不换药,没需求我就懒得说了. v写在前面 python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 v郑重承诺 我承认,现在园子里烂尾的系列博文比比皆是,

mybatis从入门到精通(二) 增删查改

mybatis从入门到精通(二) 增删查改 一丶前言 "增删查改"是后台开发的常用操作, 因此, 学习mybatis或者其他orm框架有必要统一学习一下"增删查改". 二丶准备开发环境 使用"mybatis从入门到精通(一) 入门"准备的开发环境 三丶查 -- <select/> UserMapper.java User selectUser(@Param("userId") int userId); UserMa

C语言指针教程----入门到精通&lt;二&gt;

数组与指针: 一: 指针既然可以指向变量,那么必然可以指向一个数组.本节探讨数组与指针的关系.首先读者必须明白,数组名代表数组中首元素的地址. 那么如何表示数组中其他元素的地址以及其他元素本身呢? p+i或a+i就是a[i]的地址:相应的, *(p+i)或*(a+i)就表示的a[i]元素. 已经提到了数组名代表数组首元素地址了,那么所有用数组名做参数的函数都可以改写 成用指针做参数的函数. 二:多维数组的情况. 这里,读者首先有个意识,多维数组每一维也都是一维数组.假设有个二维数组a[3][4]

Flask从入门到精通

1. flask的下载和安装 在windows下安装flask flask依赖于两个库, 即werkzeug 和jinja2 , werkzeug负责服务器的部署, jinja2负责模板引擎,管理安装flask使用virtualenv工具 安装virtualenv的目的是安装pip, 但是python默认安装时已经安装了pip 所以使用pip install flask会自动安装好werkzeug, jinja2和flask 如图所示:

Atom编辑器入门到精通(二) 插件的安装和管理

在本节中我们会学习如果安装和使用插件插件是Atom中一个非常重要的组成部分,很多功能都是以插件形式存在的.比如上篇文章中提到的目录树和设置等窗口都是通过默认安装的插件来实现的. 查看已安装的插件 打开设置窗口(Cmd+,),再切换到"Packages"标签页,就可以看到已安装的插件列表了我们可以发现Atom默认安装了70多个插件,Atom通过这些插件提供了各种非常有用的特性和功能另外在设置窗口的"Themes"标签页中也能看到所有安装过的主题(主题其实也是一种插件)

MyBatis 入门到精通(二) SQL语句映射XML文件

MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在.对于它的强大功能,SQL 映射文件的配置却非常简单. 如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射文件配置可以节省95%的代码量.MyBatis 被创建来专注于SQL,但又给您自己的实现极大的空间. 需要配置的基本元素 1. cache – 配置给定模式的缓存 2. cache-ref – 从别的模式中引用一个缓存 3. resultMap – 这是最复杂而却强大的一个元素了,它描述如何从结果集

flutter从入门到精通二

静态方法和静态属性(static): 通过static修饰的方法和属性称为静态方法和静态属性,注意静态方法和静态属性只能通过类名访问,不能通过对象访问. 静态方法不能访问非静态的属性和非静态方法,反正可以 class Person{ String name; int age; Person(this.name,this.age); printInfo(){ //在字符串中,可以直接通过${}访问类的属性和方法 print('${this.name}---${this.age}'); } } cl

Python基本语法[二],python入门到精通[四]

在上一篇博客Python基本语法,python入门到精通[二]已经为大家简单介绍了一下python的基本语法,上一篇博客的基本语法只是一个预览版的,目的是让大家对python的基本语法有个大概的了解.之所以将python的基本语法分为两部分,是因为园子里大部分人都是有编程基础的,所以在学习Python的时候可以先出个预览版的,预览版都是根据Python的语法与其他语言(java/C#/php)比较类似又不完全一样的地方,便于大家对Python有个基本理解.在大家差不多有个了解以后,我们再深入讲讲