响应即视图函数的返回值,前面的例子的返回值都很简单,直接返回值。但是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}

flask python 返回壓縮包 flask 返回值_json

二、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

flask python 返回壓縮包 flask 返回值_状态码_02

四、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"

flask python 返回壓縮包 flask 返回值_json_03

五、errorhandler装饰器

 errorhandler装饰器用于自定义异常响应信息

# 使用errorhandler装饰器自定义异常处理
# 自定义404状态的信息
@app.errorhandler(404)
def error(msg):
    return F"访问的页面不存在,{msg}"

flask python 返回壓縮包 flask 返回值_flask python 返回壓縮包_04

 

附码:

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()