是否有一个列表,其中包含不同的基于Python的REST框架的建议,以便在服务器端使用以编写自己的RESTful API?优选有利有弊.
请随时在此处添加推荐.:)
在设计RESTful API时需要注意的是GET和POST的混合,就像它们是同一个东西一样.使用Django的基于函数的视图和CherryPy的默认调度程序很容易犯这个错误,尽管这两个框架现在提供了解决这个问题的方法(分别基于类的视图和MethodDispatcher).
HTTP动词在REST 中非常重要,除非你非常小心,否则你最终会陷入REST反模式.
一些正确的框架是web.py,Flask和Bottle.当与mimerender库结合使用时(完全披露:我写了它),它们允许你编写好的RESTful webservices:
import web import json from mimerender import mimerender render_xml = lambda message: '%s '%message render_json = lambda **args: json.dumps(args) render_html = lambda message: '%s'%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()
服务的逻辑只实现一次,并且正确的表示选择(Accept标头)+调度到正确的渲染函数(或模板)是以一种整洁,透明的方式完成的.
$ curl localhost:8080/x Hello, x! $ curl -H "Accept: application/html" localhost:8080/x Hello, x! $ curl -H "Accept: application/xml" localhost:8080/xHello, x! $ 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 and Bottle框架的信息.当问到这个问题时,两者都不存在.
惊讶没人提到烧瓶.
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run()
我们将Django用于RESTful Web服务.
请注意 - 开箱即用 - Django没有足够的细粒度认证来满足我们的需求.我们使用了Django-REST接口,它有很多帮助.[我们已经推出了自己的产品,因为我们做了很多扩展,它已成为维护的噩梦.]
我们有两种URL:"html"URL实现面向人的HTML页面,"json"URL实现面向Web服务的处理.我们的视图功能通常如下所示.
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
关键是有用的功能是从两个演示中分解出来的.JSON演示文稿通常只是请求的一个对象.HTML演示文稿通常包括各种导航辅助工具和其他帮助人们提高工作效率的上下文线索.
该jsonView
功能都非常相似,它可以是一个有点讨厌.但它是Python,所以如果有帮助的话,让它们成为可调用类的一部分或编写装饰器.
请参阅Python Web框架维基.
您可能不需要完整的堆栈框架,但剩下的列表仍然很长.
我真的很喜欢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的真正喜爱; 这是一个完全可行的例子,即使对于不了解框架的人也是如此.如果您运行此代码,则可以立即在Web浏览器中查看结果; 例如,访问http:// localhost:8080/celc_to_fahr?degrees = 50将显示122.0
在您的Web浏览器中.
看一眼
Itty(博客文章)
瓶子
web.py
朱诺
我没有看到任何理由使用Django来暴露REST api,有更轻松,更灵活的解决方案.Django带来了很多其他的东西,并不总是需要.如果您只想将某些代码公开为REST服务,那么肯定不需要.
我个人的经验,fwiw,就是一旦你拥有一个通用的框架,你就会开始使用它的ORM,它的插件等等,因为它很容易,而且很快就会产生依赖性这很难摆脱.
选择一个Web框架是一个艰难的决定,我会避免选择一个完整的堆栈解决方案来暴露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动词标识符(GET,POST等)调用方法.
2010年,Pylons和repoze.bfg社区"联合起来"创建了Pyramid,这是一个最基于repoze.bfg的Web框架.它保留了其父框架的哲学,可用于RESTful服务.值得一看.
Piston是一个非常灵活的框架,用于为Django应用程序创建RESTful API.
似乎各种python web框架现在都可以实现RESTful接口.
对于Django来说,除了tastypie和活塞之外,django-rest-framework还是值得一提的.我已经顺利地迁移了我的一个项目.
Django REST框架是Django的一个轻量级REST框架,旨在使构建连接良好,自描述的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[^/]+)/$', InstanceModelView.as_view(resource=MyResource)), )
以官方网站为例,以上所有代码都提供api,自我解释文档(如基于soap的webservice)甚至沙箱进行测试.非常方便.
链接:http: //django-rest-framework.org/