Python Web框架 + [a]sync任务;长轮询:非Django
我需要创建一个项目,这个项目要有一个网页前端,用来管理同步任务执行(就像fabric那样)、异步任务(AMQP),还有长轮询/ajax,用于查看结果和队列/大数据集(想象一下tail -f syslog
的效果)。我已经有一部分用Python写的代码,可以用来实现很多具体的功能。
在看了很多现有的框架后,最明显的选择似乎是Django加Celery。不过,我并不想“学习Django”,而且我也不需要它95%的功能。我只需要简单的用户认证,也许还需要sqlalchemy,简单的ajax,amqp和xmlrpc会很有帮助。
我考虑过使用Mongrel2,但我更喜欢RabbitMQ而不是0MQ(因为一些具体实现的原因)。
我最开始花了很多时间学习Twisted,最后从中得到了几百行有用的代码,但我发现我不得不把太多的代码调整得适应它的回调模型。虽然它的确很合适(除了它自己的amqp实现),但这让我感到非常沮丧,我经历了很多次代码的迭代(每次都有新的“twisted ahah时刻”),所以现在完全不考虑它了。
有人能帮我理清思路吗?Tornado?Pylons?repoze?Pyramid?Flask?Bottle?CherryPy?Web2py?Paster/Webob?还有其他的选择吗?可以参考这个链接:http://wiki.python.org/moin/WebFrameworks。
补充说明:
需要明确的是,和RabbitMQ(或其他amqp提供者)的集成是最重要的,这也是问题的关键所在。
3 个回答
如果你打算长期使用AMQP,那我建议你不要用Celery,因为他们对AMQP的使用方式很奇怪,感觉开发者并没有真正理解AMQP的模型。
bottle是一个很不错的框架,适合快速搭建RESTful应用(我用它来创建测试用的模拟服务器),如果你已经有了处理实际工作的代码,你会惊讶于bottle应用可以写得多么简短。
我现在在用Python开发应用,使用RabbitMQ,并通过kombu来使用amqplib。最开始选择kombu是因为我想在将来可能更换库,比如用pika或其他的,但现在我希望当初就直接用amqplib,建立一个合适的Python风格的AMQP模型。
在你深入编码之前,花点时间去RabbitMQ的网站上看看关于AMQP的一些博客和幻灯片演示,这样你才能真正理解AMQP模型,否则会让自己变得更麻烦。
除非你必须和其他应用沟通,否则请不要使用xmlrpc。因为bottle让简单的RESTful应用变得非常简单,所以使用XMLRPC就显得多余复杂了。
我对Python的网页框架了解得不算全面,但想分享一下我对其中两个框架的看法:
Bottle框架很轻量,使用起来也不错。如果你想找一个简单易学、好上手的框架,这可能是个不错的选择。我用它做过一些简单的本地前端应用,感觉非常好。
Tornado在我看来是一个非常好的非阻塞服务器,适合实时网页应用。结合tornadio使用,可以很轻松地实现ajax长轮询。不过,它的学习曲线可能比Bottle稍微陡峭一些。我建议你看看tornadio示例文件夹里的聊天应用。
希望这些对你有帮助。