为什么GAE使用类和self.response.out.write而不是函数和打印?

时间:2014-11-15 06:51:28

标签: python google-app-engine webapp2

我是初学者,我想知道为什么我们使用self.response.out.write代替print,以及为什么我们首先使用类而不是函数来为请求处理程序。有什么特别的原因吗?

1 个答案:

答案 0 :(得分:3)

使用方法

在HTTP方法getpost之后,每个处理程序类都有名称为GETPOST的方法等。这些方法处理请求的函数。

对服务器的每个请求都将路由到请求处理程序对象,该对象是某个请求处理程序类的新实例。因此,每个请求都会创建一个请求处理程序实例,并在发送HTTP响应后进行垃圾回收。

通过继承webapp2.RequestHandler,您的处理程序类可以免费获得一堆功能。例如,处理程序实例将HTTP请求中的数据解析为字典,并自动绑定到self self.request.headersself.request.body

webapp2.RequestHandler课程还提供self.response,这是您撰写回复数据的内容。

初始化新请求处理程序实例后,继承的__init__方法将调用映射到HTTP请求方法的方法,因此假设GET请求,它会调用self.getwebapp2.RequestHandler类没有实现这些方法;你的派生类确实如此。

<强>响应

此处不使用print或处理程序方法的返回值。你没有回复回复&#39;有了这个框架;您将响应写入请求处理程序实例的(继承的)self.response属性。

您的实例继承self.response.out.write(别名为self.response.write),它将其参数连接到响应的主体,最初是一个空字符串。

注意:您可以致电self.response.clear清除回复正文。

当您从处理程序方法返回时 - getpost等 - 返回值将被忽略。该框架使用状态self.response自动为您创建和发送HTTP响应。

框架也在幕后处理了一系列细微之处。

功能上的类

主要优点是继承。通常,您将创建一个源自BaseHandler的{​​{1}}类。 webapp2.RequestHandler类将包含实际处理程序的核心功能。例如,它可能包括一些逻辑,用于将数据转换为Web API的小JSON包。实际处理请求的所有类都将从您的BaseHandler派生。

您希望处理程序类的自定义基类主要派生,以便您可以编辑该基类。您希望该基类继承自BaseHandler,以便所有处理程序实例都继承框架魔法。

有足够的轻微的手使整个事情令人困惑,但一旦你得到它就很容易理解,并且确实节省了很多麻烦。

从技术上讲,你可以使用函数和字典来实现上述所有功能,但Python通常是面向对象的,所以它会很痛苦和奇怪。