Flask | Flask基础 - 关于响应Response的浅析

简介: Flask | Flask基础 - 关于响应Response的浅析

关于响应(Response)

视图函数的返回值会被自动转换为一个响应对象,Flask的转换逻辑如下:

  • 如果返回的是一个合法的响应对象,则直接返回。
  • 如果返回的是一个字符串,那么Flask会重新创建一个werkzeug.wrappers.Response对象,Response将该字符串作为主体,状态码为200,MIME类型为text/html,然后返回该Response对象。
  • 如果返回的是一个元组,元祖中的数据类型是(response,status,headers)。status值会覆盖默认的200状态码,headers可以是一个列表或者字典,作为额外的消息头。
  • 如果以上条件都不满足,Flask会假设返回值是一个合法的WSGIt应用程序,并通过Response.force_type(rv,request.environ)转换为一个请求对象。

以下将用例子来进行说明:

第一个例子:直接使用Response创建:

from werkzeug.wrappers import Response
 @app.route('/about/')
 def about():
     resp = Response(response='about page',status=200,content_type='text/html;charset=utf-8')
     return resp

第二个例子:可以使用make_response函数来创建Response对象,这个方法可以设置额外的数据,比如设置cookie,header信息等:

from flask import make_response
@app.route('/about/')
def about():
    return make_response('about page')

第三个例子:通过返回元组的形式:

@app.errorhandler(404)
def not_found():
    return 'not found',404

第四个例子:自定义响应。自定义响应必须满足三个条件:

  • 必须继承自Response类。
  • 实现类方法force_type(cls,rv,environ=None)。
  • 必须指定app.response_class为你自定义的Response

以下将用一个例子来进行讲解,Restful API都是通过JSON的形式进行传递,如果你的后台跟前台进行交互,所有的URL都是发送JSON数据,那么此时你可以自定义一个叫做JSONResponse的类来代替Flask自带的Response类:

from flask import Flask,jsonify
 from werkzeug.wrappers import Response
 app = Flask(__name__)
 class JSONResponse(Response):
     default_mimetype = 'application/json'
     @classmethod
     def force_type(cls,response,environ=None):
         if isinstance(response,dict):
             response = jsonify(response)
         return super(JSONResponse,cls).force_type(response,environ)
 app.response_class = JSONResponse
 @app.route('/about/')
 def about():
     return {"message":"about page"}
 if __name__ == '__main__':
     app.run(host='0.0.0.0',port=8000)

此时如果你访问/about/这个URL,那么在页面中将会显示:

{
 "message": "about page"
}

注意以上例子,如果不写app.response_class = JSONResponse,将不能正确的将字典返回给客户端。因为字典不在Flask的响应类型支持范围中,那么将调用app.response_class这个属性的force_type类方法,而app.response_class的默认值为Response,因此会调用Response.force_class()这个类方法,他有一个默认的算法转换成字符串,但是这个算法不能满足我们的需求。因此,我们要设置app.response_class=JSONResponse,然后重写JSONResponse中的force_type类方法,在这个方法中将字典转换成JSON格式的字符串后再返回。

相关文章
|
3月前
|
NoSQL Redis UED
揭秘!Flask如何携手Celery,让异步任务处理不再是难题,打造极速响应的Web应用新纪元!
【8月更文挑战第31天】在Web开发中,Flask与Celery的结合为异步任务处理提供了强大支持。Flask作为轻量级Web框架,以其简洁灵活著称;而Celery则是一个分布式任务队列系统,擅长处理耗时任务。二者结合,Flask专注于处理Web请求,Celery则在后台异步执行复杂任务,如发送邮件或调用外部API。这种方式不仅提升了应用性能和响应速度,还优化了用户体验。下面的示例展示了如何在Flask应用中集成Celery以实现异步任务处理。
155 0
|
1月前
|
JSON 中间件 数据格式
五、Flask的请求和响应方法与常用技巧
五、Flask的请求和响应方法与常用技巧
84 0
|
3月前
|
JSON 前端开发 API
[flask]统一API响应格式
[flask]统一API响应格式
|
3月前
|
数据库 关系型数据库 MySQL
惊!Hibernate与MySQL的绝密优化技巧大揭秘,让你的数据库飞起来!
【8月更文挑战第31天】在企业应用开发中,结合使用持久层框架Hibernate与数据库管理系统MySQL可显著提升数据库交互效率。本文探讨了多项优化策略,包括配置二级缓存、采用单向关联减少JOIN操作、优化HQL查询语句以及合理使用MySQL索引。通过具体示例,文章详细讲解了如何实施这些优化措施,以期为企业应用提供更高效稳定的数据支持。
62 0
|
6月前
|
JSON 数据处理 数据库
Flask视图函数与响应处理的艺术
【4月更文挑战第15天】本文探讨了Flask框架中视图函数和响应处理的原理与实践。视图函数通过`@app.route()`装饰器与URL关联,处理用户请求并返回响应。示例展示了如何从URL或请求对象获取参数,以及执行不同操作后返回响应。Flask支持字符串、元组和响应对象等多种响应类型。最佳实践包括保持视图函数简洁、使用模板引擎、处理异常和设置正确状态码。掌握这些技能能提升Web应用的用户体验和开发效率。
|
6月前
|
Python
在Flask中,如果你想设置响应返回的HTML页面
【1月更文挑战第4天】【1月更文挑战第16篇】在Flask中,如果你想设置响应返回的HTML页面
73 1
Python Flask 编程 | 连载 04 - Flask 响应
Python Flask 编程 | 连载 04 - Flask 响应
Python Flask 编程 | 连载 04 - Flask 响应
|
存储 JSON 前端开发
Flask response响应
Flask response响应
|
存储 JSON 前端开发
【flask入门系列】flask处理请求和处理响应
上一节我写了flask获取路径参数以及转换器的使用,这节我们来讲如何获取其他地方的参数以及flask如何处理响应。
249 0
【flask入门系列】flask处理请求和处理响应
|
JSON 前端开发 数据格式
Python:Flask请求参数和响应探究
Python:Flask请求参数和响应探究
227 0