flask中的response

flask中的response,第1张

在flask中你想向前端返回数据,必须是 Response 的对象,这里和django必须是 HttpResponse 对象一样, 主要将返改袜回数据的几种方式

总结:

render_template : 导入方式 from flask import render_template

它的作用就是模板老搏渲染,最终返回html渲染好了的字符串,它需要传递的参数核含激就是 模板的名字,也就是需要渲染的html页面,还有就是这样格式的数据:key1 = value1,key2=value2这样的格式,传这些变量到模板中,肯定是渲染变量用。

redirect :导入方式 from flask import redirect

它的作用就是重定向,需要传的参数就是重定向的地址,最终返回的Response的对象

下面我用postman做下测试,

再看上面红色狂圈住的地方,这就是我们设置的两个cookies,鼠标点进去看

你们有这样的疑问的吗?我最终还是返回的Response的对象,那么浏览器是怎么知道我对 cookie 进行 *** 作呢?

答案在这里,就是响应的请求头,看看返回了哪些数据

Response 的介绍大概就是这样,还有其他属性请参考flask官方API

大部分应用并不直接使用Flask中的响应类(Response class),但这并不是说这个类没有用武之地;实际上,Flask会为每个请求创建响应对象。那么,它是如何实现的呢?

Flask用来处理请求的函数返回时,响应周期就开始了。在网络应用中,路由通常最后会调用render_template函数,渲染引用的模板文件,将其作为字符串返回:

@app.route('/index')

def index():

# ...

return render_template('index.html')

但是,你可能也知道,Flask的路由函嫌肆数可以选择额外返回两个值,这两个值将被分别设为HTTP状态码和自定义的HTTP响应标头:

@app.route('/data')

def index():

# ...

return render_template('data.json'), 201, {'Content-Type': 'application/json'}

在上面的例子中,状态码被设为201,取代了Flask默认的200,即请求被成功处理的状态码。这个例子还定义了内容类型标头(Content-Type header),表明HTTP响应中包含JSON数据,因为如果你不明确设置内容类型的话,Flask会默认设置为HTML。

上面的例肆者空子介绍了HTTP响应的三个基本组成部分,即数据或正文、状态码和标头。Flask的应用实例拥有一个make_response函数,可以接受路由函数的返回值(可以是单个值,也可以是有1-3个值的元组),并将其填入响应对象(Response object)中。

你可以通过Python控制台会话(console session),看看整个过程。首先创建一个虚拟环境,并安装Flask,然后开启Python会话,并输裂瞎入下面的代码:

>>>from flask import Flask

>>>app = Flask(__name__)

>>>app.make_response('Hello, World')

<Response 12 bytes [200 OK]>

>>>app.make_response(('Hello, World', 201))

<Response 12 bytes [201 CREATED]>

这里,我创建了一个简单的Flask应用实例,之后调用了make_response()方法创建响应类对象。第一次调用时,我传了一个字符串作为参数,所以响应对象中使用了默认的状态码和标头。第二次调用时,我传入了有两个值的元组,强制返回了非默认的状态码。注意,第二次调用时使用了两个括号,里层的括号将字符串和状态码包在了元组中。由于make_response()函数只接受一个参数,所以必须要这样做。

Flask在创建了代表路由函数返回值的响应对象(Response object)之后,还会做一些处理。包括将响应对象传入自定义的after_request处理程序(handlers),在这一步,应用还有有机会插入或修改标头、更改正文或状态码,如果愿意的话,甚至是启用崭新的的响应对象取而代之。最后,Flask会获取最终的响应对象,渲染成HTTP响应,并发送给客户端。

Flask中的响应类

我们来看看响应类中最有趣的特性。下面的类定义,展示了我眼中这个类所具备的灵活属性和方法:

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

注意,如果你去翻阅Flask的源码,是找不到上述类定义的。Flask中的Response类,实际上衍生自Werkzeug库中的一个同名类。而Werzeug中的Response类继承的是BaseResponse类,这个类中就包含了上述定义。

charset、default_status和default_mimetype这三个类属性定义了相应的默认值。如果任何一个默认值不适用你的应用,那么你可以创建Response类的子类,定义你自己的默认值,而不必在每一个响应对象中设置自定义值。例如,如果你的应用是一个所有的路由均返回XML格式数据的API接口,你就可以在自定义的类中,将default_mimetype改为application/xml,这样Flask就会默认返回XML响应。稍后你会看到如何实现。

这里,我不会详细介绍__init__构造函数(你可以阅读Werkzeug的文档),但请注意,Flask响应对象中的三个重要元素,即响应正文、状态码和标头,是作为参数传入的。在子类中,构造函数可以改变创建响应的相应规则。

响应类中的force_type()类方法,是唯一比较复杂,但又很重要的元素。有时候,Werkzeug或是Flask需要自行创建响应对象,比如出现应用错误,并需要将其返回给客户端时。在这种情况下,响应对象不是应用提供的,而是由框架创建的。在使用自定义响应类的应用中,Flask和Werkzeug无法知道自定义类的细节,所以它们使用标准响应类来创建响应。响应类中的force_type()方法,被设计为可以接受不同响应类的实例,并会将其转换成自身的格式。

我敢肯定,你一定被force_type()方法的描述搞糊涂了。说白了,就是如果Flask碰到了一个不是其期望的响应对象,就会使用该方法进行转换。我下面要讲的第三个使用场景,就利用了这个特点,让Flask的路由函数返回诸如字典、列表或者是其他任何自定义对象,作为请求的响应对象。

好了,理论就讲这么多了。接下来,我来告诉大家如何应用上面有关响应类的小技巧。准备好了吗?

使用自定义的响应类

到现在为止,我确定你也会认为:在部分有趣的场景下,使用自定义的响应类是有利的。在给出实际例子之前,我想告诉你在Flask中设置并使用自定义的响应类是多么的简单。请看下面的这个例子:

from flask import Flask, Response

class MyResponse(Response):

pass

app = Flask(__name__)

app.response_class = MyResponse

# ...

在上面的代码中,我定义了一个名叫MyResponse的自定义响应类。通常,自定义响应类会增加或修改默认类的行为,所以一般都会通过创建Flask中Response类的子类来实现。要想让Flask使用自定义类,我只需要设置app.response_class即可。

Flask类中的response_class是一个类属性,所以我们可以稍微修改上面的例子,创建一个设置了自定义响应类的Flask子类:

from flask import Flask, Response

class MyResponse(Response):

pass

class MyFlask(Flask)

response_class = MyResponse

app = MyFlask(__name__)

# ...


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12147211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存