Python REST(Web服务)框架的build议?
有不同的基于Python的REST框架的推荐列表,用于在服务器端编写您自己的RESTful API吗? 最好有正反两面。
请随时在这里添加build议。 🙂
deviseRESTful API时需要注意的一点是GET和POST的混合,就好像它们是一样的。 使用Django的基于函数的视图和CherryPy的默认分派器很容易犯这个错误,尽pipe这两个框架现在分别提供了一个解决这个问题的方法( 基于类的视图和MethodDispatcher )。
HTTP动词在REST 中非常重要 ,除非你对此非常小心,否则最终会陷入REST反模式 。
一些正确的框架是web.py , Flask和Bottle 。 当与mimerender库(完全公开:我写它)结合使用时,它们允许您编写好的RESTful web服务:
import web import json from mimerender import mimerender render_xml = lambda message: '<message>%s</message>'%message render_json = lambda **args: json.dumps(args) render_html = lambda message: '<html><body>%s</body></html>'%message render_txt = lambda message: message urls = ( '/(.*)', 'greet' ) app = web.application(urls, globals()) class greet: @mimerender( default = 'html', html = render_html, xml = render_xml, json = render_json, txt = render_txt ) def GET(self, name): if not name: name = 'world' return {'message': 'Hello, ' + name + '!'} if __name__ == "__main__": app.run()
该服务的逻辑只实现一次,正确的表示select(Accept header)+调度到适当的渲染函数(或模板)是以一种整洁,透明的方式完成的。
$ curl localhost:8080/x <html><body>Hello, x!</body></html> $ curl -H "Accept: application/html" localhost:8080/x <html><body>Hello, x!</body></html> $ curl -H "Accept: application/xml" localhost:8080/x <message>Hello, x!</message> $ curl -H "Accept: application/json" localhost:8080/x {'message':'Hello, x!'} $ curl -H "Accept: text/plain" localhost:8080/x Hello, x!
更新(2012年4月) :增加了有关Django的基于类的视图,CherryPy的MethodDispatcher和Flask和Bottle框架的信息。 当问题提出时,两人都不存在。
惊讶没有人提到烧瓶 。
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
我们正在使用Django进行REST风格的Web服务。
注意 – 开箱即用 – Django没有足够的authentication来满足我们的需求。 我们使用了Django-REST界面 ,这对我们有很大的帮助。 [我们之所以推出自己的产品,是因为我们做了这么多的扩展,已经成为维护的噩梦。]
我们有两种URL:实现面向人的HTML页面的“html”URL和实现面向Web服务的处理的“json”URL。 我们的视图function通常是这样的。
def someUsefulThing( request, object_id ): # do some processing return { a dictionary with results } def htmlView( request, object_id ): d = someUsefulThing( request, object_id ) render_to_response( 'template.html', d, ... ) def jsonView( request, object_id ): d = someUsefulThing( request, object_id ) data = serializers.serialize( 'json', d['object'], fields=EXPOSED_FIELDS ) response = HttpResponse( data, status=200, content_type='application/json' ) response['Location']= reverse( 'some.path.to.this.view', kwargs={...} ) return response
重要的是,有用的function是两个介绍中的因素。 JSON演示文稿通常只是一个请求的对象。 HTML演示文稿通常包括各种导航帮助和其他帮助人们提高生产力的上下文线索。
jsonView
函数都非常相似,这可能有点烦人。 但是它是Python,所以使它们成为可调用类的一部分,或者如果有帮助的话,可以编写装饰器。
请参阅Python Web框架 wiki。
您可能不需要完整的堆栈框架,但剩下的列表仍然很长。
我真的很喜欢CherryPy 。 下面是一个宁静的Web服务的例子:
import cherrypy from cherrypy import expose class Converter: @expose def index(self): return "Hello World!" @expose def fahr_to_celc(self, degrees): temp = (float(degrees) - 32) * 5 / 9 return "%.01f" % temp @expose def celc_to_fahr(self, degrees): temp = float(degrees) * 9 / 5 + 32 return "%.01f" % temp cherrypy.quickstart(Converter())
这强调了我对CherryPy真正喜欢的东西; 这是一个完全可行的例子,即使对不了解框架的人也是很容易理解的。 如果你运行这个代码,那么你可以立即在你的浏览器中看到结果; 例如访问http:// localhost:8080 / celc_to_fahr?degrees = 50将在您的Web浏览器中显示122.0
。
看一眼
- Itty ( 博客文章 )
- 瓶子
- web.py
- 朱诺
我没有看到任何理由使用Django来公开一个REST API,有更轻松和更灵活的解决scheme。 Django把很多其他东西带到桌子上,这并不总是需要的。 如果您只想将某些代码作为REST服务公开,肯定不需要。
我个人的经验是,一旦你有一个通用的框架,你就会开始使用它的ORM,插件等等,只是因为它很容易,而且在任何时候你最终都得不到依赖这是很难摆脱的。
select一个Web框架是一个艰难的决定,我会避免select一个完整的栈解决scheme来暴露一个REST API。
现在,如果你真的需要/想要使用Django,那么Piston是一个很好的Django应用程序的REST框架。
这就是说,CherryPy看起来非常好,但似乎比REST更多的RPC。
看样本(我从来没有使用过),如果你只需要REST,可能web.py是最好的,最干净的。
以下是关于REST的CherryPy文档的讨论: http : //docs.cherrypy.org/dev/progguide/REST.html
特别是它提到了一个名为MethodDispatcher的内置CherryPy调度器,它调用基于HTTP-verb标识符(GET,POST等)的方法。
在2010年,主塔和repoze.bfg社区“联手”创build金字塔 ,这是一个基于repoze.bfg的Web框架。 它保留了其父框架的哲学,可以用于RESTful服务 。 值得一看。
活塞是用于为Django应用程序提供RESTful API的非常灵活的框架。
似乎各种python web框架现在都可以实现RESTful接口。
对Django来说,除了tasteypie和活塞之外,django-rest-framework是一个值得一提的有前途的。 我已经顺利地将其中的一个项目迁移了。
Django REST框架是Django的一个轻量级REST框架,旨在简化构build连接良好,自我描述的RESTful Web API的过程。
快速示例:
from django.conf.urls.defaults import patterns, url from djangorestframework.resources import ModelResource from djangorestframework.views import ListOrCreateModelView, InstanceModelView from myapp.models import MyModel class MyResource(ModelResource): model = MyModel urlpatterns = patterns('', url(r'^$', ListOrCreateModelView.as_view(resource=MyResource)), url(r'^(?P<pk>[^/]+)/$', InstanceModelView.as_view(resource=MyResource)), )
以官方网站为例,以上所有代码都提供了api,自己解释的文档(如基于soap的webservice),甚至沙盒testing了一下。 很方便。
链接: http : //django-rest-framework.org/
我不是python世界的专家,但我一直在使用django这是一个很好的web框架,可以用来创build一个宁静的框架。
web2py包括支持轻松构buildRESTful API, 在这里和这里描述(video)。 特别是看一下parse_as_rest
,它可以让你定义将请求参数映射到数据库查询的URL模式; 和smart_query
,它使您能够在URL中传递任意的自然语言查询。
我正在使用Django,那么你可以把django-tastypie当成django-piston的替代品。 调整非ORM数据源比活塞更容易,并有很好的文档 。
我强烈build议TurboGears或Bottle:
TurboGears的:
- 不比django冗长
- 更灵活,更less的面向HTML
- 但是:不太出名
瓶子:
- 非常快
- 非常容易学习
- 但是:简约而不成熟
我们正在制定严格的REST服务框架,请查看http://prestans.googlecode.com
它目前在Alpha的早期,我们正在对mod_wsgi和Google的AppEngine进行testing。
寻找testing人员和反馈。 谢谢。