我是一名初学者,并且很想知道为什么我们使用self.response.out.write
而不是print
,以及为什么我们首先使用类而不是函数来处理请求处理程序。有什么特别的原因吗?为什么GAE在函数上使用类和self.response.out.write并打印?
回答
使用方法
每个处理程序类与像get
和post
名称的方法,HTTP方法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
也不是处理方法的返回值被用在这里。你不用这个框架“返回响应”;你编写对请求处理程序实例的(继承)self.response
属性的响应。
您的实例继承self.response.out.write
(其别名为self.response.write
),它将其参数连接到响应正文,最初是一个空字符串。
注意:您可以拨打self.response.clear
来清除响应主体。
当您从您的处理程序方法返回时 - get
或post
等 - 返回值被忽略。该框架使用self.response
的状态为您自动创建和发送HTTP响应。
框架在幕后也有一些细微之处。
类在功能
主要优点是在继承。通常,您将创建一个BaseHandler
类,该类来自webapp2.RequestHandler
。 BaseHandler
类将包含实际处理程序的核心功能。例如,它可能包含一些用于将数据转换为Web API的小型JSON包的逻辑。所有实际处理请求的类都将从您的BaseHandler
派生。
您希望为您的处理程序类自定义基类,以便从主要类派生,因此您可以编辑该基类。您希望该基类继承自webapp2.RequestHandler
,以便您的所有处理程序实例都继承框架魔法。
有足够的手使整个事情混淆,但一旦你明白了,很容易理解,并且节省了很多麻烦。从技术上讲,你可以使用函数和字典来实现上述所有功能,但是Python是经典的面向对象的,所以它会很痛苦和奇怪。
- 1. 为什么javascript函数不打印
- 2. 为什么这个函数打印'undefined'?
- 3. 为什么使用java -jar调用print函数时不打印?
- 4. 为什么getline(...)在屏幕上打印?
- 5. 什么Java“Dictionary”类型使用{}打印?
- 6. 为什么函数不打印列表中的值的总和?
- 7. 为什么在主函数中root的值被打印为0?
- 8. 打印后为什么使用逗号?
- 9. 匹配并打印什么+数量
- 10. 在GAE上打印html标签programmaticaly Python
- 11. 为什么在Python中打印函数的返回值?
- 12. 为什么我不能在函数内打印结果?
- 13. 为什么在这种情况下print()函数不打印
- 14. 为什么要在函数中使用const和&while声明类?
- 15. 为什么Log.d()和Log.v()不打印
- 16. 为什么print(())和input(())打印括号?
- 17. 为什么我不打印和图像
- 18. 为什么不打印?
- 19. 为什么打印1?
- 20. 为什么'假'不打印?
- 21. 为什么打印两次?
- 22. 为什么“curl_exec”打印“null”?
- 23. 为什么Exception不打印?
- 24. 为什么打印-0.0?
- 25. Python:为什么traceback打印?
- 26. 这为什么不打印?
- 27. 为什么打印出spospo?
- 28. 为什么 'setprofile' 打印此
- 29. 为什么python打印[...]
- 30. 在Python3打印函数中“*”的作用是什么?
目前还不清楚你在说什么框架。请更具体一些。 – alexanderlukanin13
这是webapp2。我已经更新了这个问题。 –