【Python】简单Web框架从零开始(三):Http响应格式

简介: 从上图可以看到响应客户端请求的协议格式与客户端请求的格式很类似,除了首行稍微不一样外。首行称为状态行,其格式为:[HTTP协议版本][空格][状态码][空格][消息][\r\n]。其中状态码是一组三位数组成的数字代码,具体介绍可以百度百科,常见的有200,400,404等等。跟在状态码后面的响应消息是与状态码对应的文本描述。 实体头部数据格式完全与请求的头部格式一致,里面包含了服务器相关的信息,以及支持哪些功能和特殊的内容。

【Python】简单Web框架从零开始(三):Http响应格式


目录


【Python】简单Web框架从零开始(一):Web服务


【Python】简单Web框架从零开始(二):Http请求格式


一、前言


   前面两期介绍HTTP网络部分和客户端请求解析,这篇介绍如何响应客户端的请求,完成请求应答之后基本的Web框架就差不多了,剩下的就是逐个补齐一些所需的模块啦。


二、响应格式


微信截图_20220424003825.png


   从上图可以看到响应客户端请求的协议格式与客户端请求的格式很类似,除了首行稍微不一样外。首行称为状态行,其格式为:[HTTP协议版本][空格][状态码][空格][消息][\r\n]。其中状态码是一组三位数组成的数字代码,具体介绍可以百度百科,常见的有200,400,404等等。跟在状态码后面的响应消息是与状态码对应的文本描述。


   实体头部数据格式完全与请求的头部格式一致,里面包含了服务器相关的信息,以及支持哪些功能和特殊的内容。


   响应数据体就是真正给客户端“显示”的内容,想要客户端正确接收到服务器的响应数据,需要在响应的实体头里面加上Content-Length用于表示响应数据体的大小,还可以增加Content-Type来表示响应数据体的内容格式。Content-Type有很多类型 ,具体可以去https://tool.oschina.net/commons/这个网站上面查看。


   客户端的请求一般分为两类,一种是静态资源请求例如访问一个静态页面(如下图展示的HTML文件页面内容),文件下载,图片请求等等。这些请求在收到服务器响应后就会在浏览器中尝试显示出来,Content-Type就可以标识响应的内容是在浏览器中渲染还是下载。另一种就是后台数据交互,例如动态获取天气信息http://www.weather.com.cn/data/cityinfo/101010100.html,服务器返回的是一段JSON格式的数据,具体如何在浏览器里面展示,就需要使用Javascript脚本进行处理了。这种一般采用Ajax后台请求数据,然后动态展示到页面上。


微信截图_20220424003836.png


三、响应代码


   理解响应的协议格式结构后,实现起来就比较简单了,在发送数据前先将状态行和请求头数据发送出去,然后在发响应数据体即可。只要注意Content-Length是必须的,且长度要等于响应数据体的长度,否则客户端就无法正确响应了。


def write_header(self, code=200, message="OK"):
    # 状态行
    self.request.wfile.write("HTTP/1.1 {0} {1}\r\n".format(code, message))
    # 实体头
    for k, v in self.headers.items():
        self.request.wfile.write("{0}: {1}\r\n".format(k,v))
    # 注意响应实体头发完后,还需要发一个空行
    self.request.wfile.write("\r\n")
def write(self, body):
    self.raw_data += body
def flush(self):
    if "Content-Length" not in self.headers:
        self.headers["Content-Length"] = len(self.raw_data)
    self.write_header(self.code, self.message)
    self.request.wfile.write(self.raw_data)
    self.request.wfile.flush()


   现在浏览器都支持的HTTP版本为1.1,因此我采用默认回复客户端HTTP/1.1,而没有动态判断。不同版本支持的行为有哪些,可以自行百度一下哦


四、完结


   具体的代码已经放到Github上,代码写的很简单仅供学习哦。后面有时间可以把模板渲染也接入进去,这样就是一个后端渲染的小框架啦。不过现在似乎比较流行前端渲染,那后端就轻松多啦。


欢迎微信搜索"游戏测试开发"关注一起沟通交流。

相关文章
|
6月前
|
算法 关系型数据库 Python
配电网中考虑需求响应(Python代码实现)【硕士论文复现】
配电网中考虑需求响应(Python代码实现)【硕士论文复现】
|
11月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
296 4
|
6月前
|
运维 算法 新能源
基于风光储能和需求响应的微电网日前经济调度(Python代码实现)
基于风光储能和需求响应的微电网日前经济调度(Python代码实现)
155 0
|
10月前
|
Python
使用Python实现multipart/form-data文件接收的http服务器
至此,使用Python实现一个可以接收 'multipart/form-data' 文件的HTTP服务器的步骤就讲解完毕了。希望通过我的讲解,你可以更好地理解其中的逻辑,另外,你也可以尝试在实际项目中运用这方面的知识。
486 69
求助!怎么上传第三方HTTPS证书?为什么我上传lets encrypt的证书显示私钥格式异常?
用户上传证书时遇到问题,提示格式异常,已尝试转换RSA格式仍未解决。
|
7月前
|
JSON 数据挖掘 API
闲鱼商品列表API响应数据python解析
闲鱼商品列表API(Goodfish.item_list)提供标准化数据接口,支持GET请求,返回商品标题、价格、图片、卖家信息等。适用于电商比价、数据分析,支持多语言调用,附Python示例代码,便于开发者快速集成。
|
7月前
|
JSON 自然语言处理 API
闲鱼商品详情API响应数据python解析
闲鱼商品详情API(goodfish.item_get)通过商品ID获取标题、价格、描述、图片等信息,支持Python等多语言调用。本文提供Python请求示例,包含请求构造与数据处理方法。
|
7月前
|
JSON API 数据格式
微店商品列表API响应数据python解析
微店商品列表API为开发者提供稳定高效获取商品信息的途径,支持HTTP GET/POST请求,返回JSON格式数据,含商品ID、名称、价格、库存等字段,适用于电商数据分析与展示平台搭建等场景。本文提供Python调用示例,助您快速上手。
|
8月前
|
IDE 开发工具 Python
魔搭notebook在web IDE下,使用jupyter notebook,python扩展包无法更新升级
魔搭notebook在web IDE下,使用jupyter notebook,python扩展包无法更新升级,不升级无法使用,安装python扩展包的时候一直停留在installing
240 4
|
9月前
|
网络协议 API 开发者
分析http.client与requests在Python中的性能差异并优化。
合理地选择 `http.client`和 `requests`库以及在此基础上优化代码,可以帮助你的Python网络编程更加顺利,无论是在性能还是在易用性上。我们通常推荐使用 `requests`库,因为它的易用性。对于需要大量详细控制的任务,或者对性能有严格要求的情况,可以考虑使用 `http.client`库。同时,不断优化并管理员连接、设定合理超时和重试都是提高网络访问效率和稳定性的好方式。
237 19

推荐镜像

更多