响应即视图函数的返回值,前面的例子的返回值都很简单,直接返回值。但是Flask Http协议的返回值中通常还会有以下几种不同的方式。
一、return元组
通过return一个元组构造响应信息。
语法如下:
return (显示的信息,状态码,返回报文首部信息) # 括号可缺省
# 以元组的响应 @app.route("/tuple/") def response_tuple(): # 最简单的响应 # return "响应成功" # 状态码和首部可缺省。状态码缺省时,默认200 # return "响应成功", 200 # return "响应成功", {"token": 666} # 状态码可自定义 # return "响应成功", 666 # 使用非标准http状态码,浏览器中会显示UNKNOWN # return "响应成功", "666 good" # 设置多个响应首部信息 return "响应成功", {"token": 666, "uid": 777}
二、jsonify函数
jsonify函数是flask封装的函数,用于将数据转换成json字符串,并修改一些headers中的信息。
from flask import jsonify import json @app.route("/json/") def response_json(): data = {"name": "zhangsan", "age": 18} # 返回json数据的两种方式 # 1、使用json包转换数据 # json.dumps(dict) 将字典转换为json字符串 # json.loads(json字符串) 将json字符串转为字典 # 1.1 将字典类型数据转换为json字符串 # data_json = json.dumps(data) # {"name": "zhangsan", "age": 18} # print(type(data_json)) # <class 'str'> # 1.2 使用元组响应的方式修改Content-Type的值为json,如果不改值为text/html; charset=utf-8 # return data_json, 200, {"Content-Type": "application/json"} # 2、使用flask封装的jsonify函数 # 2.1 数据能以键值对的方式传入 # data_json = jsonify(name="张三", age="18") # 2.2 数据也能以字典的方式传入 data_json = jsonify(data) return data_json
三、make_response函数
make_response 函数用于自定义响应信息,与元组相似。
from flask import jsonify, make_response @app.route("/response/") def response(): data = {"name": "zhangsan", "age": 18} # 自定义响应文本 resp = make_response(jsonify(data)) # 自定义响应首部 resp.headers["token"] = "aaaaa" # 自定义响应状态码 resp.status = "666 status_description" # 自定义cookie resp.set_cookie("uid", "888") return resp
四、abort函数
abort函数通常用来抛出异常,把控制权交给web服务器返回异常,比如:abort(404),传入的状态码只能使用http标准状态码。
演练代码如下:
from flask import abort, Response
@app.route("/login/") def login(): username = request.args.get("username") password = request.args.get("password") if username != "admin" or password != "admin": # 使用abort函数可以立即终止视图函数的执行,类似于return,但是abort可以返回特定信息给前端 # 1、返回标准的http状态码。比如200、300、400、500,若返回600则报错 abort(403) # 2、传递响应体信息,但是这与return效果一样,所以abort通常用于返回状态码 # resp = Response("login failed") # abort(resp) return "login success"
五、errorhandler装饰器
errorhandler装饰器用于自定义异常响应信息
# 使用errorhandler装饰器自定义异常处理 # 自定义404状态的信息 @app.errorhandler(404) def error(msg): return F"访问的页面不存在,{msg}"
附码:
from flask import Flask, request, abort, Response, jsonify, make_response import json app = Flask(__name__) # 以元组的响应 @app.route("/tuple/") def response_tuple(): # 最简单的响应 # return "响应成功" # 状态码和首部可缺省。状态码缺省时,默认200 # return "响应成功", 200 # return "响应成功", {"token": 666} # 状态码可自定义 # return "响应成功", 666 # 使用非标准http状态码,浏览器中会显示UNKNOWN # return "响应成功", "666 good" # 设置多个响应首部信息 return "响应成功", {"token": 666, "uid": 777} # abort函数 @app.route("/login/") def login(): username = request.args.get("username") password = request.args.get("password") if username != "admin" or password != "admin": # 使用abort函数可以立即终止视图函数的执行,类似于return,但是abort可以返回特定信息给前端 # 1、返回标准的http状态码。比如200、300、400、500,若返回600则报错 abort(403) # 2、传递响应体信息,但是这与return效果一样,所以abort多用于返回状态码 # resp = Response("login failed") # abort(resp) return "login success" # 使用errorhandler装饰器自定义异常处理 # 自定义404状态的信息 @app.errorhandler(404) def error(msg): return F"访问的页面不存在,{msg}" # 使用jsonify函数返回json数据 @app.route("/json/") def response_json(): data = {"name": "zhangsan", "age": 18} # 返回json数据 # 1、使用json包转换数据 # json.dumps(dict) 将字典转换为json字符串 # json.loads(json字符串) 将json字符串转为字典 # 1.1 将字典类型数据转换为json字符串 data_json = json.dumps(data) # {"name": "zhangsan", "age": 18} # print(type(data_json)) # <class 'str'> # 1.2 使用元组响应的方式修改Content-Type的值为json,如果不改值为text/html; charset=utf-8 # return data_json, 200, {"Content-Type": "application/json"} # 2、使用flask封装的jsonify函数 # 2.1 数据能以键值对的方式传入 # data_json = jsonify(name="张三", age="18") # 2.2 数据也能以字典的方式传入 data_json = jsonify(data) return data_json # 使用 make_response 函数自定义响应信息 @app.route("/response/") def response(): data = {"name": "zhangsan", "age": 18} # 自定义响应文本 resp = make_response(jsonify(data)) # 自定义响应首部 resp.headers["token"] = "aaaaa" # 自定义响应状态码 resp.status = "666 status_description" # 自定义cookie resp.set_cookie("uid", "888") return resp if __name__ == '__main__': app.run()