Flask:响应

视图函数如果返回的是一个字符串,会创建以该字符串数据为响应体,状态码为200,MIME类型为text/html的Response对象(werkzeug.wrappers.Response)。如果返回的是一个响应对象它会直接返回,如通过make_response()构建的响应对象。视图函数还可以返回元组,元组必须至少包含一个元素,该元素即为响应体,完整的元组格式为:(响应体, 状态码, 响应头字典),make_response()的参数与之一致。

1
2
3
4
5
6
7
8
9
10
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
return "Hello World", 404, {"Server":"MyServer"}

if __name__ == "__main__":
app.run()

测试上面的程序,发现在IE下变成了404页面而火狐还能正常显示Hello World,通过FireBug查看HTTP响应信息状态码确实是404。响应头部分是个字典,设置的值会覆盖默认的值。

返回JSON格式的数据

由于默认的MIME类型是text/html,而且视图函数返回的元组不能设置MIME类型,所以必须手动构建Response对象进行返回

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask
from werkzeug.wrappers import Response

app = Flask(__name__)

@app.route("/")
def index():
result = "{'name':'harmel'}"
resp = Response(result, mimetype="application/json")
return resp

if __name__ == "__main__":
app.run()

在构建对象的时候不仅仅可以设置MIME类型,还可以设置Content-Type类型,Response的构造器源码为

1
2
def __init__(self, response=None, status=None, headers=None,
mimetype=None, content_type=None, direct_passthrough=False):

Flask提供了jsonify()方法,不再需要手动拼接JSON字符串,它能将字典、列表等数据类型直接序列化成JSON数据并构造Response对象,而且设置好了MIME信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/")
def index():
result = {
"name" : "harmel",
"age" : 25
}
return jsonify(result)

if __name__ == "__main__":
app.run()

文件下载

文件下载的原理是将文件二进制数据进行返回并设置Content-Disposition响应头,在Flask中提供了一个简便的方法

1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask, send_from_directory

app = Flask(__name__)

@app.route("/")
def index():
return send_from_directory("upload", "2.mp4",
as_attachment=True,
attachment_filename="xxoo.avi")

if __name__ == "__main__":
app.run()

第一个参数为文件存放目录,在实际项目中会在配置文件中进行配置,第二个参数为前面目录下的文件(可以有多级)。查看send_from_directory()底层代码发现其主要功能就是将相对路径拼接成绝对路径,然后传给send_file()来实现文件下载,send_file()源码中通过以二进制方式读取文件后返回并修改头信息,通过as_attachment设置为True来设置Content-Disposition,通过attachment_filename设置Content-Disposition头信息中的filename,如果不指定该参数filename默认为文件名。

1
2
3
4
5
6
7
8
9
10
from flask import Flask, send_file

app = Flask(__name__)

@app.route("/")
def index():
return send_file("C:/Users/Harmel/Desktop/upload/1.rar", as_attachment=True)

if __name__ == "__main__":
app.run()

响应重定向

可以手动将状态码设置成302通过响应头Location指定跳转地址,来实现重定向的功能,在Flask中提供了redirect()方法用于生成这种响应

1
2
3
4
5
6
7
8
9
10
from flask import Flask, redirect

app = Flask(__name__)

@app.route("/")
def index():
return redirect("http://www.harmel.cn")

if __name__ == "__main__":
app.run()

还有一种特殊的响应由abort()方法生成,用于发出错误消息,一般结合@app.errorhandler()钩子来使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import Flask, abort

app = Flask(__name__)

@app.route("/<name>")
def index(name):
if name == "harmel"
abort(404)
return "Hello %s" % name

@app.errorhandler(404)
def notFound(error):
return "404"

if __name__ == "__main__":
app.run()

  • 本文作者: Harmel
  • 本文链接: http://www.harmel.cn/2018/08/flask-response.html
  • 版权声明: 文章如无特别说明,则表明该文章为原创文章,如需要转载,请注明出处。
  • 本站说明: 本站使用阿里云服务器,如果您喜欢我的网站,欢迎收藏,能捐赠支持一下就再好不过了。