前言

Response对象负责对客户端的响应,每一个请求都会有一个Response对象,那么它在一个请求的声明周期内是怎么发挥作用的呢?

Response对象

响应发生的位置

先回顾一下http请求的flask处理流程:

接收请求--》创建请求上下文--》请求上下文入栈--》创建该请求的应用上下文--》应用上下文入栈--》调用视图函数处理逻辑--》请求上下文出栈--》应用上下文出栈

Response对象在调用视图函数处理逻辑后就被创建,但是对客户端的响应在应用上下文出栈后执行。

app在视图函数处理逻辑完成后得到响应需要的Body,code和header,调用make_response方法创建一个Response对象。

响应对象分析

  • Response初始化
class Response(BaseResponse):
pass
class BaseResponse(object):
charset = 'utf-8' # 设置响应对象的编码
default_status = 200 # 设置默认的响应状态码
default_mimetype = 'text/plain' # 设置响应的body默认的类型,即text文本
automatically_set_content_length = True # 设置是否使用默认的长度限制响应大小
max_cookie_size = 4093 # 允许的默认cookie最大的字节数,大于仍然会被发送,但可能被浏览器忽略 def __init__(self, response=None, status=None, headers=None,
mimetype=None, content_type=None, direct_passthrough=False):
pass # 初始化参数
response:响应数据的body部分,
status:响应的状态码
headers:响应的头部
mimetype:如果charset参数没有设置就使用这个设置
content_type:响应body的格式,如text或json等
  • 重要的属性和方法
response.data:获取二进制的响应body数据
response.data = 'xxx' :设置响应body数据
response.calculate_content_length:获取响应的总字节数
response.header:获取响应对象的头部信息
response.status:获取字符串格式的响应状态码
response.status_code:获取int格式的响应状态码 response.freeze():将响应对象序列化,返回None
response.set_cookie():设置cookie
response.delete_cookie():删除cookie,将cookie设置为立即失效
  • set_cookie

设置cookie这个方法使用比较频繁,即原理是对响应头的Set-Cookie键的值进行设置,其受到response对象的max_cookie_size参数的限制。

def set_cookie(self, key, value='', max_age=None, expires=None,
path='/', domain=None, secure=False, httponly=False):
pass # 参数:
key:cooke的键值对的键;
value:cooke的键值对的值;
max_age:cookie的有效时间,单位为秒,如果为None,则设置成和session一样的时间长度
expires:cookie的终止日期;
path:定义服务器上哪些路径下的接口可获取服务器设置的Cookie,默认为/
domain:确定了哪些Internet域中的Web服务器可读取浏览器所存取的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。
secure:如果设置为True,传输必须使用https协议
httponly:如果设置为True,表示允许js脚本访问cookie,设置为false表示不允许;

发送响应

Response对象在创建后就需要向客户端发送响应了,我们知道,它会调用http服务器如gunicorn的回调函数。

class Response:
def __call__(self, environ, start_response):
app_iter, status, headers = self.get_wsgi_response(environ)
start_response(status, headers)
return app_iter
  • start_response是gunicorn给我们的回调函数,调用它就可以设置响应的状态码和响应头;

  • return返回给客户端Body部分。

总结

Response对象负责接收经过视图函数处理后的返回数据,将其解析编码成http协议要求的数据格式,然后调用http服务器的回调函数同时将数据返回给客户端。

参考

flask基础之Response响应对象(九)的更多相关文章

  1. Servlet的学习之Response响应对象(3)

    本篇来说明响应对象HttpServletResponse对象的最后一点内容. 首先来看响应对象控制浏览器定时刷新,在我的web应用[myservlet]中创建Servlet,在该Servlet中设置响 ...

  2. Servlet的学习之Response响应对象(2)

    本篇接上一篇<Servlet的学习之Response响应对象(1)>,继续从HttpServletResponse响应对象来介绍其方法和功能. 使用setHeader方法结合HTTP协议的 ...

  3. Django视图函数之request请求与response响应对象

    官方文档: https://docs.djangoproject.com/en/1.11/ref/request-response/ 视图中的request请求对象: 当请求页面时,Django创建一 ...

  4. Servlet的学习之Response响应对象(1)

    在之前学习了Servlet中的主体结构,包括Servlet的生命周期方法,和非生命周期方法能获取的一些非常重要的对象如ServletConfig.ServletContext对象等,而从这篇开始我们将 ...

  5. Response响应对象

    1.HttpServletResponse HttpServletResponse是一个定义在Servlet API中的接口,继承自ServletReponse接口,用于封装HTTP响应消息.HTTP ...

  6. Flask基础以及Response三剑客

    Flask的特点: 优点:小而精.三方组件全    缺点: 性能相对较差   因为依赖三方组件所以在更新的时候难免不同步 基础模板 from flask import Flask app = Flas ...

  7. flask基础之LocalProxy代理对象(八)

    前言 flask框架自带的代理对象有四个,分别是request,session,g和current_app,各自的含义我们在前面已经详细分析过.使用代理而不是显式的对象的主要目的在于这四个对象使用太过 ...

  8. django 获取request请求对象及response响应对象中的各种属性值

    django request对象和HttpResponse对象 HttpRequest对象(除非特殊说明,所有属性都是只读,session属性是个例外) HttpRequest.scheme 请求方案 ...

  9. Flask基础(10)-->http的无状态协议解决办法一(客户端cookie)

    http的无状态协议 http是一种无状态协议,浏览器请求服务器时无状态的 什么是无状态? 无状态:指的是一次用户请求时,浏览器.服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求. 无状态 ...

随机推荐

  1. PAT 甲级 1110 Complete Binary Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805359372255232 Given a tree, you are ...

  2. CentOS 修改时区的方法

    study from https://blog.csdn.net/skh2015java/article/details/85007624 第一种 tzselect 输入命令直接选择即可 第二种,直接 ...

  3. Semantic Versioning Specification & 语义化版本

    Semantic Versioning Specification & 语义化版本 Semantic Versioning Specification http://semver.org 16 ...

  4. gson 说明

    JSON对象格式 法兹测试仪测试案例编纂JavaScript对象表示法(JSON)格式的特殊字符转义,类型等,由于谷歌GSON是底层的JSON库处理类型的详细说明,请参阅到GSON文档的详细信息,请参 ...

  5. Django 高并发负载均衡

    1 什么是负载均衡? 当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能.那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台 ...

  6. 【HDU1710】树的遍历

    题目大意:给定一棵 N 个节点的二叉树的前序遍历和中序遍历,求其后序遍历. 题解:递归操作,每次只需知道先序遍历和中序遍历的开始点,左子树大小即可,根据前序遍历的开始位置可知子树根节点的坐标,再在中序 ...

  7. (转)面向对象——UML类图设计

    背景:一直以来,对UMl类图的画法不甚理解,但是随着学习的深入,发现熟练掌握UML类图,能够更好理解代码间的逻辑性,而这也是程序设计的基础所在,所以很有必要把UML好好掌握. UML类图新手入门级介绍 ...

  8. git other-误删恢复等

    修改未push的最后一次commit 如在commit后发现漏添加的文件或者commit message需要修改,则可以依次执行: git add FILE_UN_STAGED # 将未提交的文件添加 ...

  9. ideau 2018.1.2安装和使用

    此博文的各安装软件.方法技巧仅供研究使用,请勿用于商业活动.下载.操作后请于24小时内删除.对于使用过程中出现的一切问题.责任.纠纷,概不负责. 1.下载ideau-2018.1.2,点击下载,提取码 ...

  10. SQL存储过程例子

    存储过程呢,学校里学习的都是简单的.这里是我在工作的时候写的存储过程,贴出来,其中公司相关我都XXX代替了 (注:这个例子可以算是动态SQL的例子了,写死的是静态SQL,这个很灵活的传入参数的是动态S ...