我是初学者,我想知道为什么我们使用self.response.out.write
代替print
,以及为什么我们首先使用类而不是函数来为请求处理程序。有什么特别的原因吗?
答案 0 :(得分:3)
使用方法
在HTTP方法get
和post
之后,每个处理程序类都有名称为GET
和POST
的方法等。这些方法是处理请求的函数。
对服务器的每个请求都将路由到请求处理程序对象,该对象是某个请求处理程序类的新实例。因此,每个请求都会创建一个请求处理程序实例,并在发送HTTP响应后进行垃圾回收。
通过继承webapp2.RequestHandler
,您的处理程序类可以免费获得一堆功能。例如,处理程序实例将HTTP请求中的数据解析为字典,并自动绑定到self
self.request.headers
和self.request.body
。
webapp2.RequestHandler
课程还提供self.response
,这是您撰写回复数据的内容。
初始化新请求处理程序实例后,继承的__init__
方法将调用映射到HTTP请求方法的方法,因此假设GET
请求,它会调用self.get
。 webapp2.RequestHandler
类没有实现这些方法;你的派生类确实如此。
<强>响应强>
此处不使用print
或处理程序方法的返回值。你没有回复回复&#39;有了这个框架;您将响应写入请求处理程序实例的(继承的)self.response
属性。
您的实例继承self.response.out.write
(别名为self.response.write
),它将其参数连接到响应的主体,最初是一个空字符串。
注意:您可以致电self.response.clear
清除回复正文。
当您从处理程序方法返回时 - get
或post
等 - 返回值将被忽略。该框架使用状态self.response
自动为您创建和发送HTTP响应。
框架也在幕后处理了一系列细微之处。
功能上的类
主要优点是继承。通常,您将创建一个源自BaseHandler
的{{1}}类。 webapp2.RequestHandler
类将包含实际处理程序的核心功能。例如,它可能包括一些逻辑,用于将数据转换为Web API的小JSON包。实际处理请求的所有类都将从您的BaseHandler
派生。
您希望处理程序类的自定义基类主要派生,以便您可以编辑该基类。您希望该基类继承自BaseHandler
,以便所有处理程序实例都继承框架魔法。
有足够的轻微的手使整个事情令人困惑,但一旦你得到它就很容易理解,并且确实节省了很多麻烦。
从技术上讲,你可以使用函数和字典来实现上述所有功能,但Python通常是面向对象的,所以它会很痛苦和奇怪。