最后,让我们看下主页模板的不同之处。
Django拥有方便的快捷方式,在你的页面中引用其他的视图。url标签可以使你重建应用中的URLs,而不需破坏视图。这个是因为url标签会主动查询视图中的URL。
表单被不同的语法渲染,我们需要人工在表单主体中添加CSRF token,但这些区别更多的是装饰 6.3测试Pyramid版App最后,我们看看用Pyramid实现的同样的程序。与Django和Flask的最大不同是模板。只需要对Jinja2做很小的改动就足以解决我们在Django中的问题。这次不是这样的,Pyramid的Chameleon模板的语法更容易让人联想到XSLT而不是别的。
与Django模板类似,缺少for-else-endfor结构使得逻辑稍微的更清晰了。这种情况下,我们以if-for 和 if-not-for 语句块结尾以提供同样的功能。使用{{或{%来控制结构和条件的Django以及AngularJS类型的模板让使用XHTML标签的模板显得很外行。 Chameleon模板类型的一大好处是你所选择的编辑器可以正确的使语法高亮,因为模板是有些得XHTML。对于Django和Flask模板来说,你的编辑器需要能够正确的支持这些模板语言高亮显示。
Pyramid中表单得转换稍微更细致些,因为pytamid_simpleform不像Django表单的form.as_ul函数那样可以自动转换所有的表单字段。 现在我们看看什么返回给应用。首先,定义我们需要得表单并呈现我们的主页。
获取午餐的查询语法和Flask的很相似,这是因为这两个demo应用使用了流行的SQLAlchemy ORM来提供持久存储。在Pyramid中,允许你直接返回模板上下文的字典,而不是要调用特殊的render函数。@view_config装饰器自动将返回的上下文传入要渲染的模板。避免调用render方法使得Pyramid写的函数更加容易测试,因为它们返回的数据没有被模板渲染对象掩盖。
从Pyramid的请求对象中更加容易得到表单数据,因为在我们获取时会自动将表单POST数据解析成dict。为了阻止同一时间多并发的请求数据库,ZopeTransactions模块提供了上下文管理器,对写入逻辑事物的数据库进行分组,并阻止应用的线程在各个改变时互相影响,这在你的视图共享一个全局session并接收到大量通信的情况下将会是个问题。 7. 总结Pyramid是三个中最灵活的。它可以用于小的应用,正如我们所见,但它也支撑着有名的网站如Dropbox。开源社区如Fedora选择它开发应用,如他们社区中的徽章系统,从项目工具中接受事件的信息,并向用户奖励成就类型的徽章。对于Pyramid的一个最常见的抱怨是,它提供了这么多的选项,以至于用它开始一个新项目很吓人。 目前最流行的框架是Django,使用它的网站列表也令人印象深刻。Bitbucket,Pinterest,Instagram,以及Onion完全或部分使用Django。对于有常见需求的网站,Django是非常理智的选择,也因此它成为中大型网站应用的流行选择。 Flask对于那些开发小项目、需要快速制作一个简单的Python支撑的网站的开发者很有用。它提供小型的统一工具,或者在已有的API上构建的简单网络接口。可以快速开发需要简单web接口并不怎么配置的后端项目使用Flask将会在前端获益,如jitviewer提供了一个web接口来检测PyPy just-in-time的编译日志。 这三个框架都能解决我们简单的需求,我们已经看到了它们的不同。这些区别不仅仅是装饰性的,它们将会改变你设计产品的方法,以及添加新特性和修复的速度。因为我们的例子很小,我们看到Flask的闪光点,以及Django在小规模应用上的笨重。Pyramid的灵活并未体现出来,因为我们的要求是一样的,但在真实场景中,新的需求会常常出现。 7.1 致谢 标题图像的logo来自与Flask、Django和Pyramid项目网站。 这篇文章非常感谢它的评阅者,Remy DeCausemaker,Ross Delinger和Liam Middlebrook,忍受了许多初期的草稿。 这篇文章的当前样式来自于Adam Chainz、bendwarn、Serger Maertens、Tom Leo和wichert的评论和修正(名字按字母表顺序)。 |