flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法
请求钩子:
当我们需要对请求进行预处理和后处理时,就可以用Flask提供的回调函数(钩子),他们可用来注册在请求处理的不同阶段执行的处理函数。这些请求钩子使用装饰器实现,通过程序实例app调用,以 before_request钩子为例(请求之前),当你对一个函数附加了app.before_request装饰器后,就会将这个函数注册为before_request处理函数,每次执行请求前都会触发所有before_request函数
Flask默认 实现的五种钩子:

示例代码:
定义了三个视图函数 A,B,C,其中C使用了after_this_request钩子,在网页中请求url 为/C,会触发C视图函数,在执行该函数的流程是先进入before_first_requst钩子,然后进入before_request钩子,之后进入C函数内部注册的after_this_request钩子函数。
之后的after_requet和teardown_request在触发响应条件时会执行。
@app.before_request
def before_request():
print "before request" @app.before_first_request
def before_first_request():
print "before first request" # @app.after_request
# def after_request(response):
# print "after request" @app.after_request
def per_request_callbacks(response):
for func in getattr(g, 'call_after_request', ()):
print "after request"
response = func(response)
return response @app.route('/A')
def A():
return '<p> this is function A</p>' @app.route('/B')
def B():
return '<p>this is function B</p>' @app.route('/C')
def C():
@flask.after_this_request
def after_this_request(response):
print "after this request"
#raise ValueError
return response
return "<p>after this request</p>" if __name__ == '__main__':
app.run(debug = True)
结果:


http响应
Flask程序中,客户端的请求会触发相应的视图函数,获取返回值作为响应的主题,最后生成完整的响应,即响应报文
响应报文:
响应报文有协议版本、状态码、原因短语、响应首部和响应主体组成


响应报文的首部包含一些关于响应和服务器的信息,这些内容有Flask生成,而我们在视图函数中返回的内容即为响应报文中的主体内容。浏览器接收响应后,会把返回的响应主题解析并显示 在浏览器窗口上。
HTTP状态码用来表示请求处理的结果

在Flask中生成响应
响应在Flask中使用Response对象表示 ,响应报文中的大部分内容有服务器处理,大多数情况下,我们只负责返主题内容。
Flask处理请求时会先判断是否可以找到与请求URL相匹配的路由,如果没有则返回404响应。如果有,则调用对应的视图函数,视图函数的返回值构成了响应报文的主题内容,正确返回时状态码默认为200,Flask会调用make_response()方法将视图函数返回值转换为响应对象。
完整的说,视图函数可以返回最多有三个元素组成的元祖:响应主题、状态码、首部字段。其中首部字段可以为字典,或是两元素元祖组成的列表([(‘Location’,’http://localhost:5000/hi’),(‘contentType’,’…’)])
flask请求成功时默认的响应码是200

可以对请求指定不同的响应状态码:指定url为hi的请求的响应状态码为201

结果:

重定向
重定向可以通过修改30X响应的首部Location的字段的值来进行:
在视图函数中,return语句后面用字典的形式指定Location的值,访问的时候,会根据Location的值进行重定向
@app.route('/redirect')
def redirect():
return "<p>This is a redirect pare</p>"
@app.route('/hello1')
def hello1():
print "redirect..."
return '', 302, {'Location': 'http://127.0.0.1:5000/redirect'}
if __name__ == '__main__':
app.run(debug = True)
结果:

访问hello1路径时,页面进行了重定向,重定向的位置是首部中Location字段的URL

也可以通过Flask提供的redirect()函数来生成重定向响应
from flask import Flask,redirect
@app.route('/hello2')
def hello2():
return redirect('http://localhost:5000/redirect')
if __name__ == '__main__':
app.run(debug = True)
结果:

修改重定向redirect函数返回码为303
@app.route('/hello2')
def hello2():
return redirect('http://localhost:5000/redirect',303)
if __name__ == '__main__':
app.run(debug = True)
结果:

程序内重定向到其他视图函数
如果要在程序内重定向到其他视图函数,可以在redirect()函数中使用url_for()函数生成目标URL,可以在响应首部的Location看到重定向的目标URL,重定向到其他视图其实就是重定向到该视图对应的url
from flask import Flask,redirect,url_for
@app.route('/hello3')
def hello3():
return redirect(url_for('redirect'))#重定向到/redirect
@app.route('/redirect')
def redirect():
return "<p>This is a redirect pare</p>"
if __name__ == '__main__':
app.run(debug = True)
结果:

手动返回错误响应
大多数情况下,Flask会自动处理常见的错误响应。HTTP错误对应的异常类在Werkzeug的werkzeug.exceptions模块中定义,抛出这些异常即可返回对应的错误响应。如果你想手动返回错误响应,可以使用Flask提供的abort()函数。
在abort()函数中传入状态码即可返回对应的错误响应。
需要注意,abourt()函数被调用后,abort()函数之后的代码不会被执行。
例子为手动返回404错误:
from flask import abort
@app.route('/404')
def not_found():
abort(404)
if __name__ == '__main__':
app.run(debug = True)
结果:

响应格式:
在http响应中,数据可以通过多种格式传输,我们会使用HTML格式,这也是Flask中的默认审核制。在特定的情况下,我们也会用其他格式。不同的响应数据格式需要设置不同的MIME类型,MIME类型在首部的Content-Type字段中定义,以默认的HTML类型为例 :
Content-Type: text/html; charset=utf-8
MIME类型
MIME类型(又称media type或content type)是一种用来表示文件类型的机制,它与文件扩展名相对应,可以让客户端区分不同的内容类型,并执行不同的操作。一般的格式为“类型名/子类型名”。其中子类型名一般为文件扩展名。比如HTML的MIME类型为”text/html”,png图片的MIME类型为”image/png”。
如果想使用其他MIME类型,可以通过Flask提供的make_response()方法生成响应对象,传入响应的主体作为参数,然后使用响应对象的mimetype属性设置MIME类型,不需要设置字符集(charset)选项。
修改MIME类型:
from flask import make_response
@app.route('/foo')
def foo():
response = make_response('Hello,World!')
response.mimetype = 'text/plain'
return response
结果:

常用的数据格式(纯文本、HTML、XML和JSON)对应的MIME类型
纯文本的MIME类型:text/plain
HTML的MIME类型:text/html
XML的MIME类型:application/xml
JSON的MIME类型:application/json
Flask提供JSON的支持
Flask通过引入Python标准库中的json模块为程序提供了JSON支持。你可以直接从Flask中导入json对象,然后调用dumps()方法将字典、列表或元祖序列化为JSON字符串,在使用前面介绍的方法修改MIME类型,即可返回JSON响应
例如:
用json模块把响应转换为JSON
from flask import Flask,make_response,json
@app.route('/foo1')
def foo1():
data={'name':'Sam Xia','gender':'male'}
response = make_response(json.dumps(data))
response.mimetype = 'application/json'
return response
if __name__ == '__main__':
app.run(debug = True)
结果:

也可以jsonnify()方法转换响应内容为JSON
不过我们一般并不直接使用json模块的dumps()、load()等方法,因为Flask通过包装这些方法提供了更方便的jsonify()函数。用jsonify()函数,我们进需要传入数据或参数,他会把传入的参数转化成JSON字符串作为响应的主体,然后生成一个响应对象,并且设置正确的MIME类型。
例如:
@app.route('/foo3')
def foo3():
return jsonify(name = 'Sam Xia',gender = 'make')
if __name__ == '__main__':
app.run(debug = True)
结果:

jsonify()函数可以接收多种形式的参数。可以传入如上边的关键字参数,也可以像dumps()方法一样传入字段、列表或元祖,如:
from flask import jsonify
@app.route('/foo3')
def foo3():
return jsonify({'name':'Sam Xia','gender' : 'make'})#传入字典
if __name__ == '__main__':
app.run(debug = True)
结果:

jsonify()函数可以自定义响应码
from flask import jsonify
@app.route('/foo3')
def foo3():
return jsonify(message = 'Error !'),500
if __name__ == '__main__':
app.run(debug = True)
结果:

flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法的更多相关文章
- 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范
一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...
- 【postMan】发送post请求,返回错误码415
解决方法: 参看:https://www.cnblogs.com/spec-dog/p/3731279.html 将Request的Content-Type:application/json;char ...
- JSP基础知识➣客户端请求与服务端响应(三)
JSP客户端请求 浏览器请求服务器端,信息头的一些重要内容,在以后的网络编程中将会经常见到这些信息: Accept:指定浏览器或其他客户端可以处理的MIME类型.它的值通常为 image/png 或 ...
- flask框架基本使用(2)(响应与重定向)
#转载请留言联系 flask 框架基本使用(1):https://www.cnblogs.com/chichung/p/9756935.html 1. flask 自定义返回状态码与响应头 from ...
- (三)flask中的请求钩子函数
请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...
- Flask参数解析、请求钩子
转载请注明出处 https://www.cnblogs.com/chenxianpao/p/9949279.html 参数解析 Flask的参数解析主要用Request完成(from flask i ...
- Flask 中请求钩子的理解和应用?
请求钩子是通过装饰器的形式实现的,支持以下四种:1,before_first_request 在处理第一个请求前运行2,before_request:在每次请求前运行3,after_request:如 ...
- 图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应
作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络 ...
- flask 之 请求钩子
请求钩子 什么是请求钩子? 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. f ...
随机推荐
- Navicat工具的使用 1
Navicat 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数据库 官网下载:https: ...
- 并发编程---死锁||递归锁---信号量---Event事件---定时器
死锁 互斥锁:Lock(),互斥锁只能acquire一次 递归锁: RLock(),可以连续acquire多次,每acquire一次计数器+1,只有计数为0时,才能被抢到acquire # 死锁 f ...
- 002-pro ant design-Unexpected end of JSON input while parsing near '...错误解决方案
解决方法:先清除缓存,再重新安装 清除缓存 npm cache clean --force 重新安装 npm install
- [QGLViewer]鼠标取点后回调
纠结的一天:QGLViewer控件重载鼠标事件(AxMapControl类),如何在点击鼠标之后执行一个回调,通知主界面Viewer类执行一个操作. 先是考虑直接使用C风格的回调函数,在AxMapCo ...
- configure.in详解
configure.in文件里基本的内容就是一系列的m4宏,在运行时根据传递给它们的参数,定义的宏就会扩展为shell的脚本代码段.也可以手工书写shell代码.不过我们就不说这个了,要想完全的理解c ...
- jenkins 设置钉钉通知--钉钉机器人
https://blog.csdn.net/workdsz/article/details/77531802
- SVM、LR、决策树的对比
一.LR LR,DT,SVM都有自身的特性,首先来看一下LR,工业界最受青睐的机器学习算法,训练.预测的高效性能以及算法容易实现使其能轻松适应工业界的需求.LR还有个非常方便实用的额外功能就是它并不会 ...
- python one
哈哈,今天把它搞了 谁? Python啊! ..... *************************************** python:解释性语言,功能很强大,现在很有市场! & ...
- iOS UI基础-14.0 DatePicker
DatePicker的主要属性: Mode:显示的内容,可以选择日期.时间的自由组合 Locale:显示的语言样式 Interval:每个选项的时间间隔 Date:当前选择的时间 Constraint ...
- ida6.8 android so调试
献给还不会的同学. 我的设备 1.魅族手机,自带root功能 2.ida6.8 1.上传ida 目录下dbgsrv/android_server 到 手机上,这个目录自己可以修改,网上都用的adb p ...