设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

选择一个Python Web框架:Django vs Flask vs Pyramid

2014-11-6 10:50| 发布者: joejoe0332| 查看: 15256| 评论: 0|原作者: Ley, 开源中国榨菜, thunderCoding, Boobs|来自: oschina

摘要: Pyramid, Django, 和 Flask都是优秀的框架,为项目选择其中的哪一个都是伤脑筋的事。我们将会用三种框架实现相同功能的应用来更容易的对比三者。也可以直接跳到框架实战(Frameworks in Action)章节查看代码(code ...


  最后,让我们看下主页模板的不同之处。


1
2
3
4
5
6
7
<ul>
{% for lunch in lunches %}
<li><strong>{{ lunch.submitter }}</strong> just ate <strong>{{ lunch.food }}</strong></li>
{% empty %}
<em>Nobody has eaten lunch, you must all be starving!</em>
{% endfor %}
</ul>


  Django拥有方便的快捷方式,在你的页面中引用其他的视图。url标签可以使你重建应用中的URLs,而不需破坏视图。这个是因为url标签会主动查询视图中的URL。


1
2
3
4
5
<form action="{% url 'newlunch' %}" method="post">
  {% csrf_token %}
  {{ form.as_ul }}
  <input type="submit" value="I ate this!" />
</form>

  表单被不同的语法渲染,我们需要人工在表单主体中添加CSRF token,但这些区别更多的是装饰


6.3测试Pyramid版App

  最后,我们看看用Pyramid实现的同样的程序。与Django和Flask的最大不同是模板。只需要对Jinja2做很小的改动就足以解决我们在Django中的问题。这次不是这样的,Pyramid的Chameleon模板的语法更容易让人联想到XSLT而不是别的。


1
2
3
4
5
6
7
8
9
10
11
<!-- pyramid_wut4lunch/templates/index.pt -->
<div tal:condition="lunches">
  <ul>
    <div tal:repeat="lunch lunches" tal:omit-tag="">
      <li tal:content="string:${lunch.submitter} just ate ${lunch.food}"/>
    </div>
  </ul>
</div>
<div tal:condition="not:lunches">
  <em>Nobody has eaten lunch, you must all be starving!</em>
</div>


  与Django模板类似,缺少for-else-endfor结构使得逻辑稍微的更清晰了。这种情况下,我们以if-for 和 if-not-for 语句块结尾以提供同样的功能。使用{{或{%来控制结构和条件的Django以及AngularJS类型的模板让使用XHTML标签的模板显得很外行。


  Chameleon模板类型的一大好处是你所选择的编辑器可以正确的使语法高亮,因为模板是有些得XHTML。对于Django和Flask模板来说,你的编辑器需要能够正确的支持这些模板语言高亮显示。


1
2
3
4
5
6
7
8
9
10
<b>What are YOU eating?</b>
 
<form method="POST" action="/newlunch">
  Name: ${form.text("submitter", size=40)}
  <br/>
  What did you eat? ${form.text("food", size=40)}
  <br/>
  <input type="submit" value="I ate this!" />
</form>
</html>


  Pyramid中表单得转换稍微更细致些,因为pytamid_simpleform不像Django表单的form.as_ul函数那样可以自动转换所有的表单字段。


  现在我们看看什么返回给应用。首先,定义我们需要得表单并呈现我们的主页。

1
2
3
4
5
6
7
8
9
10
11
# pyramid_wut4lunch/views.py
class LunchSchema(Schema):
    submitter = validators.UnicodeString()
    food = validators.UnicodeString()
 
@view_config(route_name='home',
             renderer='templates/index.pt')
def home(request):
    lunches = DBSession.query(Lunch).all()
    form = Form(request, schema=LunchSchema())
    return {'lunches': lunches, 'form': FormRenderer(form)}


  获取午餐的查询语法和Flask的很相似,这是因为这两个demo应用使用了流行的SQLAlchemy ORM来提供持久存储。在Pyramid中,允许你直接返回模板上下文的字典,而不是要调用特殊的render函数。@view_config装饰器自动将返回的上下文传入要渲染的模板。避免调用render方法使得Pyramid写的函数更加容易测试,因为它们返回的数据没有被模板渲染对象掩盖。


1
2
3
4
5
6
7
8
9
10
11
12
13
@view_config(route_name='newlunch',
             renderer='templates/index.pt',
             request_method='POST')
def newlunch(request):
    = Lunch(
        submitter=request.POST.get('submitter''nobody'),
        food=request.POST.get('food''nothing'),
    )
 
    with transaction.manager:
        DBSession.add(l)
 
    raise exc.HTTPSeeOther('/')


  从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的评论和修正(名字按字母表顺序)。


酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部