在 Python 中从头开始架构:使用啥?

Posted

技术标签:

【中文标题】在 Python 中从头开始架构:使用啥?【英文标题】:Architecting from scratch in Python: what to use?在 Python 中从头开始架构:使用什么? 【发布时间】:2011-03-09 18:11:34 【问题描述】:

我很幸运能够完全控制我公司应用程序的架构,我决定放弃我们用 Ruby/Rails 编写的原型并用 Python 重新开始。这有几个原因:我想学习 Python,我更喜欢语法,而且我基本上说过“F**k it,让我们去做吧。”

所以,考虑到这将是一个非常密集的应用程序,我想听听您对以下方面的意见:

通用网络框架 ORM/数据库层(可能与 MongoDB 一起使用) 带有 oAuth/xAuth 身份验证的 RESTful API 测试/BDD 支持 消息队列(如果可能,我希望将其保留在 Python 中)

API 将需要与 Clojure 应用程序交互以处理一些内部数据,并与消息队列交互,因此如果它不是 Python,最好有一些库。

TDD/BDD 对我来说非常重要,所以测试越多越好!

阅读您对此的想法会非常有趣。非常感谢。

最好的,

杰米

【问题讨论】:

【参考方案1】:

好吧,你可能犯了一个错误,和我开始使用 python 时一样。

在您决定使用 django 之类的东西之前,它是一个优秀但非典型 python web 框架,花一个晚上拥抱:

This,是一个好的开始。确保你做 A little Werkzeug watching ,然后检查 一些经典的WebOb。也许,如果你感觉到了血液中的火,你可能会,wsgi有点缺陷,但仅限于上帝,请查看Flask

我不是说用它,Django 也很漂亮,但是如果你不懂 python,而且你通过 django,你会冒着学习框架的风险。

WSGI 非常简单。您将了解 Paste、Pastescript 和 Pylons。

然后,做出你的决定。学习做简单的 wsgi 或 Flask 的东西会容易得多,比如变量赋值,使用解释器,样式问题,测试,在 3 个文件上花几个晚上,而不是 django。住2晚。然后你会看到 python web 框架之间的巨大相似性,而不是差异。见鬼,你甚至可以使用 Flask。

只是一些建议,我对 ruby​​ 做了同样的事情,通过 Rails 进入,并且......好吧,说了一些强有力的词。

语言,然后是基本的 wsgi 和测试,然后选择你的框架并滚动

【讨论】:

这实际上是一个很好的建议,谢谢。我实际上是在和 Django 一起学习 Python - 我在 Django 之外使用它来做一些其他的事情。【参考方案2】:

我正在为基于 python 的网络应用程序使用基于 Twisted Framework 的 Nevow 库。

您的所有标准都适合这个单一框架。

【讨论】:

如果你以前做过网络编程,Nevow 的“模板语言”就太糟糕了——基本上它涉及writing html with python code。如果您坚持使用 Twisted 并想使用现代框架,我建议您使用 Cyclone。它以 Tornado 为模型,这是一个 WSGI 风格的应用程序,但建立在 Twisted 之上,Twisted 为 MongoDB 之类的东西提供了很好的异步库。【参考方案3】:

框架

好的,所以我在这里有点偏见,因为我目前广泛使用 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(因为我编写了它的一部分并且它很小),但其他的正在积极开发中。我倾向于为小型、愚蠢的 Web 服务执行此操作,然后将它们与中间的 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/) 也不错,它是一种“用于 Web 浏览的简单脚本语言”,对于一些功能测试非常方便。 Freshen (http://github.com/rlisagor/freshen) 是 Python 的黄瓜端口。我还没有习惯在愤怒中使用它,但现在快速浏览一下就会发现它比我上次看的时候好多了。

实际上,我还使用 Ruby 对 Python 应用程序和 API 进行高级测试,因为我喜欢 celerity 和 cucumber 的结合。但我很奇怪,并且为此受到其他 Python 人的滑稽表情。

消息队列

对于消息队列,无论我使用什么语言,我现在总是使用 RabbitMQ。过去我在 stompserver 上取得了一些成功,但 Rabbit 很棒。不要担心它本身不是用 Python 编写的,PostgresSQL、nginx 或 MongoDB 也不是——这都是有充分理由的。您关心的是可用的库。您在这里寻找的是 py-amqplib (http://barryp.org/software/py-amqplib/),它是一个用于交谈 amqp(与 rabbit 以及其他消息队列交谈的协议)的低级库。我还使用了 Carrot (http://github.com/ask/carrot/),它更容易上手并提供更好的 API。如果您熟悉 Ruby,请考虑一下 Ruby 中的兔子。

环境

无论您决定使用 Python 生态系统中的哪些点点滴滴,我都建议您了解 pip 和 virtualenv(http://clemesha.org/blog/2009/jul/05/modern-python-hacker-tools-virtualenv-fabric-pip/ - 请注意,fabric 也很酷,但不是必需的,并且这些文档在该工具上已过时)。考虑在没有 gem、bundler 或 rvm 的情况下使用 Ruby,你会朝着正确的方向前进。

【讨论】:

我会提到 buildout 作为 virtualenv 的替代品。 IMO 它解决了同样的问题并为您提供了更多。我犹豫了几个月,但最终,“bin/buildout”为我提供了独立的库、我选择的 interp 以及可重定位和可部署的构建系统。 我强烈推荐 Flask 作为 Web 开发框架。看看吧。【参考方案4】:

我自己是 python 新手,并计划今年更深入地了解它。我在这方面有过一些错误的开始,但总是专业需求让我回到 php。有几次我做了一些开发,我在使用 web2py 作为 python 框架方面有非常好的经验。它做得很好,功能齐全,同时仍然非常轻巧。数据库层似乎非常灵活和成熟。

至于 TDD/BDD 和您的其他问题,我对 python 选项没有任何经验,但很想听听其他人怎么说。

【讨论】:

以上是关于在 Python 中从头开始架构:使用啥?的主要内容,如果未能解决你的问题,请参考以下文章

用 numpy 从头开始​​构建 KNN 分类器,代码有啥问题?

有啥方法可以下载 _blogger_ 主题并将其上传到 _GitHub_ 页面,而不是从头开始编码 **css** 或使用 **jekyll** 主题?

您能否从头开始训练具有特定任务架构的BERT模型?

如何使用 python 从头开始​​编写 Midi 文件

在 python 中使用 in 运算符搜索列表时使用啥算法?

从头开始实现朴素贝叶斯算法