Flask与webapp2在谷歌应用引擎上的比较
我正在开始一个新的Google App Engine应用程序,目前在考虑两个框架:Flask和webapp2。我对之前在App Engine应用中使用的内置webapp框架相当满意,所以我觉得webapp2会更好,我应该不会遇到什么问题。
不过,Flask有很多好评,我很喜欢它的设计理念,以及我在文档中看到的所有内容,我想试试看。但我有点担心使用Flask时可能会遇到的限制。
所以,我想问的是——你知道Flask在Google App Engine应用中可能带来的问题、性能问题或限制吗(比如路由系统、内置的授权机制等)?我所说的“问题”是指那种我无法用几行代码(或者任何合理数量的代码和努力)解决的,或者是完全不可能解决的事情。
还有一个后续问题:你认为Flask有没有什么特别的功能,可以让我惊艳到,尽管可能会遇到一些问题,我还是愿意使用它?
5 个回答
对我来说,选择webapp2很简单,因为我发现flask一开始并不是一个面向对象的框架,而webapp2则是一个纯粹的面向对象框架。webapp2使用的方法是基于请求处理的,这在flask的文档中被称为Method Based Dispatching,并且从V0.7版本开始在MethodViews中实现。而在flask中,MethodViews只是一个附加功能,而在webapp2中这是一个核心设计原则。因此,使用这两个框架时,你的软件设计会有所不同。现在这两个框架都使用jinja2模板,功能上也非常相似。
我更喜欢在一个基础的RequestHandler类中添加安全检查,然后从这个类继承。这对一些工具函数等也很有帮助。比如在链接[3]中,你可以重写一些方法来阻止请求的处理。
如果你是一个面向对象的人,或者需要设计一个REST服务器,我会推荐你使用webapp2。如果你更喜欢用简单的函数和装饰器来处理多种请求类型,或者对面向对象的继承不太舒服,那就选择flask。我认为这两个框架都避免了像pyramid这样更大框架的复杂性和依赖性。
你的问题范围很广,但在Google App Engine上使用Flask似乎没有什么大问题。
这个邮件列表的讨论链接了几个模板:
这里还有一个专门讲解Flask和App Engine组合的教程:
http://www.franciscosouza.com/2010/08/flying-with-flask-on-google-app-engine/
另外,可以查看这些链接,了解人们在使用Flask和Google App Engine时遇到的问题:App Engine - 访问Twitter数据困难 - Flask,Flask消息闪烁在重定向中失败,以及 如何在Google App Engine中管理第三方Python库?(virtualenv?pip?)。
免责声明:我是tipfy和webapp2的作者。
使用webapp(或者它的自然发展版本webapp2)有一个很大的好处,就是你不需要为你选择的框架自己创建现有SDK处理程序的版本。
举个例子,deferred使用了一个webapp处理程序。如果你想在纯Flask视图中使用它,使用werkzeug.Request和werkzeug.Response,你就需要为它实现deferred(就像我在这里为tipfy做的那样)。
其他处理程序也是如此:blobstore(Werkzeug仍然不支持范围请求,所以即使你创建自己的处理程序,也需要使用WebOb——参见tipfy.appengine.blobstore),邮件,XMPP等等,未来SDK中可能会包含的其他处理程序也是如此。
对于那些专为App Engine设计的库,比如ProtoRPC,它基于webapp,如果你不想在同一个应用中混合使用webapp和你选择的框架的处理程序,就需要一个移植或适配器来使其与其他框架兼容。
所以,即使你选择了不同的框架,你最终要么会在某些特殊情况下使用webapp,要么就得为特定的SDK处理程序或功能创建和维护自己的版本,如果你想使用它们。
我个人更喜欢Werkzeug而不是WebOb,但在花了一年多的时间移植和维护与tipfy原生兼容的SDK处理程序版本后,我意识到这是一场无望的斗争——为了长期支持GAE,最好的办法是紧跟webapp/WebOb。这使得支持SDK库变得轻松,维护也变得简单,未来新库和SDK功能可以直接使用,而且还有一个庞大的社区在围绕相同的App Engine工具进行合作。
关于webapp2的具体优点可以在这里找到。再加上webapp2可以在App Engine之外使用,并且很容易定制成流行的微框架样子,你就有了很好的理由去选择它。此外,webapp2很有可能会被包含在未来的SDK发布中(这只是非官方的,不要引用我 :-)),这将推动它的发展,吸引新的开发者和贡献。
话虽如此,我是Werkzeug和Pocoo团队的忠实粉丝,从Flask和其他框架(如web.py,Tornado)中借鉴了很多东西,但——你知道,我有偏见——上述webapp2的优点应该被考虑在内。