Python REST(Web 服务)框架的推荐?[关闭]
- 2025-02-28 08:23:00
- admin 原创
- 58
问题描述:
有没有推荐一些基于 Python 的 REST 框架的列表,供在服务器端使用以编写自己的 RESTful API?最好列出优缺点。
请随意在此添加建议。:)
解决方案 1:
设计 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 标头)+分派到适当的渲染函数(或模板)。
$ 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 框架的信息。提出问题时,这些都不存在。
解决方案 2:
很惊讶没有人提到flask。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
解决方案 3:
我们正在使用Django提供 RESTful 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,所以如果有帮助的话,请将它们作为可调用类的一部分或编写装饰器。
解决方案 4:
请参阅Python Web 框架wiki。
您可能不需要全栈框架,但剩下的列表仍然很长。
解决方案 5:
我真的很喜欢CherryPy。这是一个 RESTful 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 浏览器中。
解决方案 6:
看看
Itty(博客文章)
瓶子
网页.py
朱诺
解决方案 7:
我认为没有必要仅仅为了公开 REST API 而使用 Django,因为有更轻量、更灵活的解决方案。Django 还提供了许多其他功能,但这些功能并非总是需要的。如果您只想将一些代码公开为 REST 服务,那么肯定不需要。
我的个人经验是,一旦你拥有一个万能的框架,你就会开始使用它的 ORM、插件等,只是因为它很容易,而且很快你就会拥有一个很难摆脱的依赖关系。
选择一个 Web 框架是一个艰难的决定,我会避免仅仅为了公开 REST API 而选择一个全栈解决方案。
现在,如果您真的需要/想要使用 Django,那么 Piston 是一个适用于 django 应用程序的不错的 REST 框架。
话虽如此,CherryPy 看起来也确实不错,但似乎更多的是 RPC 而不是 REST。
查看样本(我从未使用过),如果您只需要 REST,那么 web.py 可能是最好和最干净的。
解决方案 8:
以下是 CherryPy 文档中有关 REST 的讨论:http://docs.cherrypy.org/dev/progguide/REST.html
特别是,它提到了一个内置的 CherryPy 调度程序,称为 MethodDispatcher,它根据 HTTP 动词标识符(GET、POST 等)调用方法。
解决方案 9:
2010 年,Pylons 和 repoze.bfg 社区“联手”创建了Pyramid,这是一个主要基于 repoze.bfg 的 Web 框架。它保留了其父框架的理念,可用于RESTful 服务。值得一看。
解决方案 10:
Piston是一个非常灵活的框架,用于为 Django 应用程序编写 RESTful API。
解决方案 11:
现在似乎各种 Python Web 框架都可以实现 RESTful 接口。
对于 Django,除了 tastypie 和 piston 之外,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<pk>[^/]+)/$', InstanceModelView.as_view(resource=MyResource)),
)
以官方网站上的例子为例,以上所有代码都提供了api,自解释文档(如基于soap的webservice),甚至还有沙盒可以进行一些测试。非常方便。
链接:
http://django-rest-framework.org/
解决方案 12:
我不是 Python 领域的专家,但我一直在使用django,它是一个优秀的 Web 框架,可以用来创建一个 restful 框架。
解决方案 13:
web2py支持轻松构建 RESTful API,详情请见此处和此处(视频)。具体来说,请查看parse_as_rest
,它允许您定义将请求参数映射到数据库查询的 URL 模式;以及smart_query
,它使您能够在 URL 中传递任意自然语言查询。
解决方案 14:
如果你正在使用 Django,那么你可以考虑使用django-tastypie来替代django-piston。它比 piston 更容易调整非 ORM 数据源,并且有很好的文档。
解决方案 15:
我强烈推荐 TurboGears 或 Bottle:
涡轮齿轮:
比 django 简洁
更加灵活,更少 HTML 导向
但:不太出名
瓶子:
非常快
非常容易学习
但:简约而不成熟
解决方案 16:
我们正在开发一个严格的 REST 服务框架,请查看http://prestans.googlecode.com
目前它处于早期 Alpha 阶段,我们正在针对 mod_wsgi 和 Google 的 AppEngine 进行测试。
正在寻找测试人员和反馈。谢谢。
扫码咨询,免费领取项目管理大礼包!