python实现web应用框架之增加响应对象
作者:真的不能告诉你我的名字 发布时间:2022-04-08 02:33:37
本篇文章所编写的代码,已经放到了gitee
上了:gitee.com/pdudo/golea…
本文所依赖的环境为:
在目前的框架中,我们发现一个很恶心的事情,就是没办法自定义响应头,我们是直接在框架里面写死了,可以在myWeb.py
代码中查看:
所以本篇文章将继续编写web
应用框架,将增加一个响应对象response
。
什么是响应对象
我们是否注意到此前框架的一个问题,那就是我们只能定义 状态码 和 报文主体,而且是通过return
的形式返回的,代码案例如下:
虽然接收客户端数据,我们可以通过r
来获取,但是我们想向客户端发送一些内容,全部都要通过return
来做,而r
只能获取客户端的值,是不是非常不方便呢? 所以我们想效仿flask
框架,做一个简单的响应对象出来,不仅可以接收客户端参数,还能够通过其框架自身提供的方法来设置web
状态属性,例如: headers
等等。
我们如何新增响应对象呢?
是否还记得我们上一篇文章所提及的python
的值传递和引用传递。我们可以新增一个类,因为类在python
中是引用传递的,所以在函数中对该值做了任何修改,都会影响到原先的值。
这里写一个类的传递案例:
在上述代码中,我们定义了一个类叫做className
, 在实例化为对象的时候,需要传入一个参数x
,除此之外,该类还有一个方法setY
,该方法会接收一直值y
,并且赋值给self.y
。在主函数中,我们首先实例化一个对象,传入数据1
,而后将实例放到函数modify_class
中,该函数会调用其实例的setY
方法,上述书传入一个99
。而且在函数执行前后,都打印了一下对象的x
和y
的值。
程序执行结果:
可见,在函数中传输的class
对象,确实是引用传递。
那么如何新增响应对象呢? 我们首先定义一个类response
用以存放响应对象的信息,而后在每一个客户端连接到服务器后,为每一个可互换的分配一个response
对象,该对象中我们需要先将wsgi
框架的environ
引入,而后再定义一些常用的方法来存储web
的状态信息,如header
和状态码等。在用户自定义函数中,会对该值进行修改,我们再其执行完毕后,由框架收回,进行遍历,修改web
状态,而后返回客户端,至此,响应对象执行完毕。
新增响应对象代码编写
响应对象类的定义
我们先定义响应对象的类,其response
类代码如下:
class response():
def __init__(self,environ):
self.response = environ
self.headers = {}
self.httpcode = 200
self.regular = ()
def set_headers(self,key,val):
if key and val:
self.headers[key] = val
else:
raise ValueError("set header , Key or val is empty")
def status_code(self,code):
self.httpcode = code
上述代码,我们定义了一个类response
,在实例化为对象的时候,需要传入environ
信息。该类有4个属性,分别是:
response: 客户端
http
请求信息。headers: 返回客户端的响应头。
httpcode:
http
状态码。regular: 动态路由捕获到的动态数据。
除此之外,还有2个方法:
set_headers: 设置响应头,接收一个
key
和value
,存储到self.headers
中。status_code: 设置返回状态码,存储到
self.httpcode
中。
框架中对响应对象的解析
如上,我们最简单的响应对象类已经创建完毕了,现在来看看在wsgi
中应该如何编写以便来存储该信息。
在wsgi
启动函数中,我们需要将response
实例化为对象,并给将客户端的environ
传给实例,代码如下:
def application(environ, start_response):
r = response(environ)
在生成响应报文headers
的时候,我们需要将对象中的headers
取出来,放到列表中,其代码如下:
headers = [(key,val) for key , val in r.headers.items()]
如上代码,我们使用使用迭代器实现遍历字典,将其存储到列表中,列表的每个值类型是元组,元组有2个数据,前者是字典的key,后则是字典的value。该数据结构,也是wsgi
所规定的。
除此之外,还有很多的细节,比如,将捕获到的动态路由信息存储到regular
中,从httpcode
中读读取响应状态码,从而返回给客户端。
对于使用框架的人而言,如何调用框架呢? 现在调用框架实例如下:
import myWeb
@myWeb.routes(path="/ip",methods="all")
def indx(r):
print(r.response["REMOTE_ADDR"])
return r.response["REMOTE_ADDR"]
@myWeb.routes(path="/hello/{name}",methods="get",regular=True)
def helloWold(r):
name = r.regular
print("捕获到的动态路由值: " , r.regular)
r.set_headers("Server", "pdudo_web_sites")
r.set_headers("Content-type", "text/html")
r.httpcode = 200
return "hello %s" % (name)
在上述代码中,我们不需要为动态路由额外定义形参来接收值了,所有的值由响应对象中获取,而且还能通过set_headers
来新增headers
,是不是比之前更加方便了呢?
功能测试
我们已经将myWeb.py
编写好了,这里仅仅编辑main.py
,代码如下:
我们运行代码后,访问/ip
和/hello/pdudo
路由尝试一下:
在查看一下web
服务器的日志:
可见,增加响应对象成功。
来源:https://juejin.cn/post/7229712382296883255


猜你喜欢
- 背景当我慢慢的开在高速公路上,宽敞的马路非常的拥挤!这时候我喜欢让百度导航的小度给我讲笑话,但她有点弱,每次只能讲一个。百度号称要发力人工智
- 一、问题在windows上面使用eclipse开发的项目在windows上面运行一切正常,部署到腾讯云时出现向MySQL数据库中插入数据是中
- 本节笔者主将要介绍Active Server Page的另一对象Response,Response对象的作用是在向浏览器发送数据。将Resp
- 各种请求方式pip3 install requests>>> import requests>>> r
- 实现的功能:在win7下,每天晚上1点,自动将 F:/data中所有文件进行压缩,以[mongodb+日期]命名,将压缩好的文件存储在本地目
- 1.应用领域:全角和半角的转换通常用在自然语言处理过程中,由于全角和半角的不一致会导致信息抽取不一致,在使用语料训练语言模型会导致模型的效果
- 本文实例讲述了JS+CSS模拟可以无刷新显示内容的留言板功能。分享给大家供大家参考。具体实现方法如下:<!DOCTYPE html P
- 主要步骤:import shutilshutil.copyfile(old_image,new_image)完整:这里要做的是,将原图片复制
- CentOS6.9+Mysql5.7.18源码安装,以下操作均在root用户下执行。1、安装依赖工具cmake make3.75+ gcc4
- 在“循环”一节,我们已经讨论了Python基本的循环语法。这一节,我们将接触更加灵活的循环方式。range()在Python中,for循环后
- 如提取第1行,第2列的值:df.iloc[[0],[1]]则会返回一个df,即有字段名和行号。如果用values属性取值:df.iloc[[
- 本文代码重点在于演示Python扩展库matplotlib.pyplot中fill_between()函数的用法。import numpy
- 1. 线性表简介线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列。线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一
- C#调用python脚本在平常工程项目开发过程中常常会涉及到机器学习、深度学习算法方面的开发任务,但是受限于程序设计语言本身的应用特点,该类
- 引子之前clubot使用的pyxmpp2的默认mainloop也就是一个poll的主循环,但是clubot上线后资源占用非常厉害,使用str
- MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名。用主机名在
- 继承与threading.Thread实现有返回值的子类MyThread,废话不多说,大家直接看代码import threadingclas
- 功能:创建两个滑动条来分别控制高斯核的size和σσ的大小,这个程序是在阈值分割的那个程序上改动的。阈值分割程序在这 注意:由于σ=0σ=0
- 一般来说,造成MySQL出现中文乱码的因素主要有下列几点:1.server本身字符集设定的问题,例如还停留在latin12.table的语系
- torch.nn.Modules 相当于是对网络某种层的封装,包括网络结构以及网络参数和一些操作torch.nn.Module 是所有神经网