Python REST(Web服务)框架的建议?
是否有列表中某处列出了不同基于Python的REST框架的建议,以供在服务器端用于编写您自己的RESTful API? 最好有优点和缺点。
请随时在这里添加建议。 :)
设计RESTful API时需要注意的一点是GET和POST的混合,就好像它们是一样的。 使用Django的基于函数的视图和CherryPy的默认分派器很容易犯这个错误,虽然现在两个框架都提供了解决这个问题的方法(分别基于类的视图和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()
该服务的逻辑只执行一次,并且正确的表示选择(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没有足够的验证来满足我们的需求。 我们使用了Django-REST界面,这个界面非常有帮助。 [我们自己推出了自己的产品,因为我们做了如此多的扩展以至于它已成为维护噩梦。]
我们有两种URL:实现面向人的HTML页面的“html”URL和实现面向Web服务的处理的“json”URL。 我们的视图功能通常是这样的。
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,因此如果它有帮助,可以将它们作为可调用类的一部分或写入装饰器。
上一篇: Recommendations of Python REST (web services) framework?