上一篇详细介绍web
应用框架的帖子,己经阐述了怎么添加动态路由,这里简单回望下: 在咱们整理的架构中,大家加上动态路由,是采用了正则匹配,另外在登记注册的情况下,必须标明该路由器是要求路由器,即: regular=True
。如果还没有看了上一篇文章的小伙伴们,建议还是看上一篇文章,便于可以做到承前启后:
python|web应用框架|提升动态路由: /post/722896…
本文所整理的编码,早已放在了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
云服务器日志:
由此可见,提升回应目标取得成功。
汇总
该一篇文章,又为他们的web
应用框架增加了回应目标,不但能设heade
,还能够设定状态码等,还可以把我们捕捉过的动态路由名字加上,那样用户在用该框架的情况下,就不会出现装饰器中的函数公式该如何编写了。