python|web应用框架|增加响应对象

简介: python|web应用框架|增加响应对象

上一篇介绍web应用框架的文章,我们已经介绍了如何添加动态路由,这里简单回顾下: 在我们编写的框架中,我们添加动态路由,是使用了正则表达式,同时在注册的时候,需要注明该路由是请求路由,即: regular=True。如果还没看过上一篇文章的小伙伴,建议先看上一篇文章,以便能够做到承上启下:

python|web应用框架|增加动态路由: juejin.cn/post/722896…


本篇文章所编写的代码,已经放到了gitee上了:gitee.com/pdudo/golea…


本文所依赖的环境为:


image.png


在目前的框架中,我们发现一个很恶心的事情,就是没办法自定义响应头,我们是直接在框架里面写死了,可以在myWeb.py代码中查看:

image.png

所以本篇文章将继续编写web应用框架,将增加一个响应对象response



什么是响应对象


我们是否注意到此前框架的一个问题,那就是我们只能定义 状态码 和 报文主体,而且是通过return的形式返回的,代码案例如下:

image.png

虽然接收客户端数据,我们可以通过r来获取,但是我们想向客户端发送一些内容,全部都要通过return来做,而r只能获取客户端的值,是不是非常不方便呢? 所以我们想效仿flask框架,做一个简单的响应对象出来,不仅可以接收客户端参数,还能够通过其框架自身提供的方法来设置web状态属性,例如: headers等等。



我们如何新增响应对象呢?


是否还记得我们上一篇文章所提及的python的值传递和引用传递。我们可以新增一个类,因为类在python中是引用传递的,所以在函数中对该值做了任何修改,都会影响到原先的值。


这里写一个类的传递案例:

image.png


在上述代码中,我们定义了一个类叫做className, 在实例化为对象的时候,需要传入一个参数x,除此之外,该类还有一个方法setY,该方法会接收一直值y,并且赋值给self.y。在主函数中,我们首先实例化一个对象,传入数据1,而后将实例放到函数modify_class中,该函数会调用其实例的setY方法,上述书传入一个99。而且在函数执行前后,都打印了一下对象的xy的值。


程序执行结果:

image.png


可见,在函数中传输的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,代码如下:

image.png

我们运行代码后,访问/ip/hello/pdudo路由尝试一下:

image.png


在查看一下web服务器的日志:

image.png

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



总结


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


相关文章
|
1天前
|
机器人 Shell 开发者
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
`roslibpy`是一个Python库,它允许非ROS(Robot Operating System)环境(如Web浏览器、移动应用等)与ROS环境进行交互。通过使用`roslibpy`,开发者可以编写Python代码来远程控制ROS节点,发布和订阅话题,以及调用服务。
18 8
|
2天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
【7月更文挑战第13天】在Web开发中,AJAX和Fetch API是实现页面无刷新数据交换的关键。在Flask博客系统中,通过创建获取评论的GET路由,我们可以展示使用AJAX和Fetch API的前端实现。AJAX通过XMLHttpRequest发送请求,处理响应并在成功时更新DOM。Fetch API则使用Promise简化异步操作,代码更现代。这两个工具都能实现不刷新页面查看评论,Fetch API的语法更简洁,错误处理更直观。掌握这些技巧能提升Python Web项目的用户体验和开发效率。
15 7
|
1天前
|
前端开发 API 开发者
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
【7月更文挑战第14天】在Web开发中,AJAX和Fetch API扮演着关键角色,用于前后端异步通信。AJAX通过XMLHttpRequest实现页面局部更新,但回调模式和复杂API有一定局限。Fetch API作为现代替代,利用Promise简化异步处理,提供更丰富功能和错误处理。Python后端如Flask、Django支持这些交互,助力构建高性能应用。从AJAX到Fetch API的进步,结合Python,提升了开发效率和用户体验。
6 0
|
1天前
|
XML 前端开发 API
颠覆传统!AJAX、Fetch API与Python后端,开启Web开发新篇章!
【7月更文挑战第14天】Web开发中,AJAX作为异步通信先驱,与新兴的Fetch API一起革新交互体验。Fetch基于Promise,简化了请求处理。Python后端,如Flask,提供稳定支撑。这三者的融合,推动Web应用达到新高度,实现高效、实时交互。通过示例展示,我们看到从发送请求到更新UI的流畅过程,以及Python如何轻松返回JSON数据。这种组合揭示了现代Web开发的潜力和魅力。
7 0
|
1天前
|
安全 API 数据库
Django/Flask不只是框架,它们是你Web开发路上的超级英雄!
【7月更文挑战第14天】Django与Flask,Python Web开发的双雄。Django提供全面功能,如ORM、模板引擎,适合大型项目;Flask轻量灵活,适用于快速迭代的定制化应用。Django示例展示ORM简化数据库操作,Flask示例演示构建RESTful API的便捷。两者各有所长,为开发者创造无限可能。**
|
1天前
|
Python
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
10 0
|
1天前
|
网络协议 安全 Python
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
我们将使用Python的内置库`http.server`来创建一个简单的Web服务器。虽然这个示例相对简单,但我们可以围绕它展开许多讨论,包括HTTP协议、网络编程、异常处理、多线程等。
5 0
|
1天前
|
Python
`cmd`模块是Python标准库中的一个模块,它提供了一个简单的框架来创建命令行解释器。
`cmd`模块是Python标准库中的一个模块,它提供了一个简单的框架来创建命令行解释器。
4 0
|
2天前
|
API 数据库 开发者
逆袭之路!Django/Flask助你成为Web开发界的璀璨新星!
【7月更文挑战第13天】在Python Web开发中,Django和Flask各具优势。Django适合快速构建大型项目,如在线书店,其ORM和内置功能让复杂应用轻松上手。Flask则以其轻量和灵活性见长,适用于个人博客等小型应用。选择框架应根据项目需求和个人偏好,两者都能助开发者在Web开发领域大放异彩。
11 2
|
3天前
|
安全 大数据 编译器
PHP 8: 探索新特性及其对现代Web开发的影响
在这篇文章中,我们将深入探讨PHP 8的最新特性,包括JIT编译器、联合类型、匹配表达式等,并分析这些更新如何影响现代Web开发。通过具体示例和代码片段,本文旨在为开发者提供一个清晰的指南,以便更好地利用PHP 8的新功能优化和加速他们的应用程序。
10 2