从头开始用Python架构:用什么?

20 投票
4 回答
4632 浏览
提问于 2025-04-16 00:35

我很幸运能完全掌控我们公司应用的架构,我决定放弃用Ruby/Rails写的原型,重新用Python来开发。这是因为几个原因:我想学习Python,我更喜欢它的语法,而且我基本上就是想说“算了,干脆来吧”。

考虑到这个应用会比较复杂,我想听听你们对以下几点的看法:

  • 通用的网页框架
  • ORM/数据库层(可能会用到MongoDB)
  • 带有oAuth/xAuth认证的RESTful API
  • 测试/行为驱动开发(BDD)支持
  • 消息队列(如果可能的话,我希望也用Python来实现)

这个API需要和一个Clojure应用对接,以处理一些内部数据的事情,还要和消息队列连接,所以如果不是用Python的话,能有一些相关的库就太好了。

测试驱动开发(TDD)和行为驱动开发(BDD)对我来说非常重要,所以越多测试越好!

期待看到你们的想法,非常感谢。

祝好,

Jamie

4 个回答

4

我自己也是刚开始学Python,计划今年深入研究一下。之前尝试过几次,但总是因为工作需要又回到了PHP。几次开发的经历中,我发现web2py这个Python框架真的不错。它做得很棒,功能也很齐全,而且非常轻量级。数据库层看起来非常灵活,成熟度也很高。

至于TDD/BDD和你其他的问题,我对Python这方面没有经验,但我很想听听其他人的看法。

14

好吧,你可能犯了一个错误,这个错误我刚开始学Python时也犯过。

在你决定使用像Django这样的框架之前,Django是一个很棒但有点不寻常的Python网页框架,先花一晚时间了解一下:

这个链接是个不错的开始。确保你看看Werkzeug的相关视频,然后再了解一些经典的WebOb。如果你感到热情高涨,虽然WSGI有点缺陷,但这只是对大神们而言,可以看看Flask

我不是说一定要用Flask,Django也很美,但如果你对Python还不太了解,直接跳进Django的话,你可能只是在学习一个框架而不是Python本身。

WSGI其实很简单。你会了解到Paste、Pastescript和Pylons这些东西。

然后再做决定。学习基础的WSGI或Flask会简单得多,比如变量赋值、使用解释器、代码风格、测试等,花两晚时间在3个文件上,而不是直接学Django。花两晚时间后,你会发现Python网页框架之间的相似性,而不是差异。说不定你会喜欢上Flask。

这只是一些建议,我在学习Ruby时也是直接从Rails入手,结果……说了不少狠话。

先学语言,然后是基础的WSGI和测试,最后再选择你的框架开始动手。

29

框架

我有点偏见,因为我现在大量使用Django,并且在伦敦组织Django用户组,所以请在阅读以下内容时考虑这一点。

首先推荐Django,因为它是一个很好的入门选择。它有很多文档和资料,还有一个非常活跃的社区可以交流,网上也有很多示例代码。

这完全是个非技术性的理由。Pylons在Python哲学上可能更纯粹(因为它更像是一堆独立的小组件),但很多技术方面的选择其实是个人偏好,至少在你对Python了解得更多之前是这样的。不过,如果你对比一下Stack Overflow上Django的活跃程度和Pylons或TurboGears的活跃程度,我认为无论代码如何,开始使用Django都简单得多。

就我个人而言,我通常选择Django,但发现我越来越多地选择使用更简单的微框架(想想Sinatra而不是Rails)。有很多选择(这里有个不错的列表,http://fewagainstmany.com/blog/python-micro-frameworks-are-all-the-rage)。我倾向于使用MNML(因为我参与了部分开发,而且它很小),但其他框架也在积极开发中。我通常会用这些微框架来做一些小的、简单的网络服务,然后再通过一个Django项目把它们串联起来,提供给用户。

这里值得注意的是appengine。你需要在它的限制内工作,它并不适合所有事情,但它是一个很好的方式,可以快速玩转Python并让一些东西运行起来。它是学习和实验的一个很好的平台。

Mongo/ORM

在MongoDB方面,你可能想先看看基本的Python Mongo库(http://api.mongodb.org/python/),看看它是否满足你的需求。如果你真的想要更像ORM的东西,那么mongoengine(http://hmarr.com/mongoengine/)可能就是你要找的。一些人也在努力让Django与nosql后端更无缝地集成。其中一些功能会在未来的Django版本中推出,但django-norel(http://www.allbuttonspressed.com/projects/django-nonrel)现在就有代码了。

对于关系型数据,如果你想要一个独立的解决方案,SQLAlchemy(http://www.sqlalchemy.org/)是个不错的选择。如果你在使用Django,Django的ORM也非常出色。

API

最官方的Oauth库是python-oauth2(http://github.com/simplegeo/python-oauth2),它的文档中有Django的示例。

Piston(http://bitbucket.org/jespern/django-piston/wiki/Home)是一个Django应用,提供了很多构建API的工具。它的优点是活跃且维护良好,已经在很多地方投入使用。还有其他项目,比如Dagny(http://zacharyvoase.github.com/dagny/),这是一个早期尝试创建类似于Rails的RESTful资源的项目。

实际上,任何Python框架(甚至只是原始的WSGI代码)都应该能很好地完成这类任务。

测试

Python的标准库中有unittest,而unittest2在Python 2.7中也有(但也可以在之前的版本中使用,http://pypi.python.org/pypi/unittest2/0.1.4)。有些人也喜欢Nose(http://code.google.com/p/python-nose/),这是一个带有一些额外功能的替代测试运行器。Twill(http://twill.idyll.org/)也不错,它是“一个用于网页浏览的简单脚本语言”,所以在一些功能测试中很方便。Freshen(http://github.com/rlisagor/freshen)是Cucumber在Python中的移植。我还没来得及深入使用,但现在快速看一下,感觉比我上次看时好多了。

实际上,我也会用Ruby来对Python应用和API进行高层次的测试,因为我喜欢Celerity和Cucumber的组合。但我比较特别,其他Python开发者对我这样做有些奇怪的眼光。

消息队列

对于消息队列,无论我使用什么语言,现在我总是选择RabbitMQ。我以前用过stompserver,也有一些成功的经验,但Rabbit真的很棒。别担心它不是用Python写的,PostgresSQL、Nginx或MongoDB也不是——这都是有原因的。你关心的是可用的库。你需要的是py-amqplib(http://barryp.org/software/py-amqplib/),这是一个用于与Rabbit及其他消息队列通信的低级库。我也用过Carrot(http://github.com/ask/carrot/),它更容易上手,提供了更好的API。如果你熟悉Ruby,可以想象成bunny。

环境

无论你决定使用Python生态系统中的哪些组件,我建议你了解一下pip和virtualenv(http://clemesha.org/blog/2009/jul/05/modern-python-hacker-tools-virtualenv-fabric-pip/——注意fabric也很酷,但不是必需的,这些文档在这个工具上有些过时)。想想如果没有gem、bundler或rvm的Ruby,你就能理解我说的方向。

撰写回答