Flask-Response

41次阅读

共计 1620 个字符,预计需要花费 5 分钟才能阅读完成。

flask jsonify() 函数返回 json 响应

app = Flask(__name__)
@app.route('/json/<name>')
def index(name):
    return jsonify({'Hello':name})

这时候 content-Type=application/json

如果用 python 的 json.dumps() 函数

@app.route('/dumps/<name>')
def py(name):
    return json.dumps({'Hello':name})

这时候 content-Type=text/html; charset=utf-8。如果选择响应的格式的话,return json.dumps({‘Hello’:name}),{‘Content-Type’:’application/json’} 那么 content-Type=application/json 就会响应 json 格式

flask Response 响应类实际上来自 Werzeug 中的 Response 类,它继承的是 python 的 BaseResponse 类

我们可以自定义响应

>>> from flask import Flask
>>> app = Flask(__name__)
>>> app.make_response(("<h1>Hello word</h1>",201))
<Response 16 bytes [201 CREATED]>

make_response 接收一个参数,返回信息和状态码都在一个元组里

Response 类定义:

class Response:
    charset = 'utf-8'
    default_status = 200
    default_mimetype = 'text/html'

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

    @classmethod
    def force_type(cls, response, environ=None):
        pass

我们可以自定义 Response 的子类,对他的行为做出一些改变,Flask 类的 response_class 属性可以改变响应类。

from falsk import FLask, Response

calss MyResponse(Response):
    default_mimetype = 'application/xml'  #修改内容类型
  
class Myfalsk(Flask):
    response_class = Myresponse
    
@app.route('/')
def index():
    return '''<?xml version='1.0'encoding="UTF-8"?>
    <person>
        <name>Yang</name>
    </person>
    '''
如果想要其他的内容类型,可以设置 Content-Type 的值:return "{'name':'yang'}",{'Content-Type'='application/json'}

重写 Response 类来过滤 Json 格式的内容格式:

class Myresponse(Response):
    @classmethod
    def force_type(cls, response, environ=None):
        if isinstance(response, dict):
            response = jsonify(response)
        return super().force(response, environ)

重写 forec_type 来自定义对未知返回对象的处理。falsk 只知道对字符串和二进制类型进行处理响应,其他位置类型比如字典都通过 forec_type 函数进行处理,我们定义的如果返回的是 dict 类型那么用 flask 的 jsonify 函数转换成 json 内容类型。

正文完
 0