python实现web应用框架之增加响应对象

 更新时间:2023年05月06日 08:44:07   作者:真的不能告诉你我的名字  
这篇文章主要介绍了python利用web应用框架如何增加响应对象的,文中有相应的代码示例,对大家的学习或工作有一定的参考价值,需要的同学可以参考下

本篇文章所编写的代码,已经放到了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。而且在函数执行前后,都打印了一下对象的xy的值。

程序执行结果:

可见,在函数中传输的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: 设置响应头,接收一个keyvalue,存储到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服务器的日志:

可见,增加响应对象成功。

总结

该篇文章,我们又为我们的web应用框架新增了响应对象,不仅可以设置heade,还可以设置状态码等等,还能够将我们捕获到的动态路由名称加进去,这样用户在使用该框架的时候,就不用担心装饰器下的函数应该如何编写了。

以上就是python web应用框架之增加响应对象的详细内容,更多关于python增加响应对象的资料请关注脚本之家其它相关文章!

相关文章

  • pytorch 实现在预训练模型的 input上增减通道

    pytorch 实现在预训练模型的 input上增减通道

    今天小编就为大家分享一篇pytorch 实现在预训练模型的 input上增减通道,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python语法学习print中f-string用法示例

    python语法学习print中f-string用法示例

    这篇文章主要为大家介绍了python语法学习print中f-string用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • python装饰器代码解析

    python装饰器代码解析

    这篇文章主要介绍了python装饰器代码解析,文章分享的内容有装饰器通用模型及一些关键点,通过举例详细介绍,具有一的参考价值,需要的朋友可以参考一下
    2022-03-03
  • Python如何对接文心一言

    Python如何对接文心一言

    这篇文章主要为大家介绍了Python如何对接文心一言的操作实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Django框架中数据的连锁查询和限制返回数据的方法

    Django框架中数据的连锁查询和限制返回数据的方法

    这篇文章主要介绍了Django框架中数据的连锁查询和限制返回数据的方法,Django是Python重多高人气框架中最为著名的一个,需要的朋友可以参考下
    2015-07-07
  • Python编写屏幕网格生成工具

    Python编写屏幕网格生成工具

    这篇文章主要为大家详细介绍了如何通过Python编写屏幕网格生成工具,可以定期绘制一个透明的网格,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-12-12
  • Python3数据库操作包pymysql的操作方法

    Python3数据库操作包pymysql的操作方法

    这篇文章主要介绍了Python3数据库操作包pymysql的操作方法,文章通过实例代码相结合给大家介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • python使用正则表达式的search()函数实现指定位置搜索功能

    python使用正则表达式的search()函数实现指定位置搜索功能

    SEARCH函数,函数名。主要用来返回指定的字符串在原始字符串中首次出现的位置 ,从左到右查找,忽略英文字母的大小写。接下来通过本文给大家介绍python使用正则表达式的search()函数实现指定位置搜索功能,需要的朋友一起看看吧
    2017-11-11
  • python文件写入write()的操作

    python文件写入write()的操作

    这篇文章主要介绍了python文件写入write()的操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 如何利用Python和OpenCV对图像进行加水印详解

    如何利用Python和OpenCV对图像进行加水印详解

    Python使用opencv是因为觉得它足够强大,很多图像处理这块都是用的它,最近就用opencv添加个水印,这篇文章主要给大家介绍了关于如何利用Python和OpenCV对图像进行加水印的相关资料,需要的朋友可以参考下
    2021-10-10

最新评论