Python REST(Web 服务)框架的推荐?[关闭]

2025-02-28 08:23:00
admin
原创
58
摘要:问题描述:有没有推荐一些基于 Python 的 REST 框架的列表,供在服务器端使用以编写自己的 RESTful API?最好列出优缺点。请随意在此添加建议。:)解决方案 1:设计 RESTful API 时需要注意不要将 GET 和 POST 混为一谈,好像它们是同一件事。使用Django的基于函数的视图...

问题描述:

有没有推荐一些基于 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 进行测试。

正在寻找测试人员和反馈。谢谢。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3018  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1880  
  PLM(产品生命周期管理)系统在企业产品研发、生产与管理过程中发挥着至关重要的作用。它能够整合产品全生命周期中的各类数据与流程,提升企业的协同效率、降低成本并加速产品上市。然而,不同企业由于业务模式、产品特性以及管理理念的差异,对PLM系统有着个性化的需求。如何实现这些个性化需求,成为企业在实施PLM系统定制开发时面临...
免费plm软件   0  
  在企业的发展进程中,跨地域协同工作变得愈发普遍和重要。不同地区的团队需要紧密合作,以实现资源共享、提高效率和创新能力。而产品生命周期管理(PLM)系统在这一过程中发挥着关键作用,尤其是其分布式架构,为跨地域协同提供了强大的支持。PLM系统概述PLM系统是一种用于管理产品从概念设计到退役全生命周期过程中所有数据和流程的软...
免费plm管理软件   0  
  在企业项目管理中,资源平衡是确保项目顺利推进、提高效率与效益的关键环节。产品生命周期管理(PLM)系统作为整合产品全生命周期信息与流程的重要工具,为实现资源平衡提供了强大的支持。通过合理运用PLM系统,企业能够优化资源分配、提升协同效率,从而在激烈的市场竞争中占据优势。接下来,我们将深入探讨如何借助PLM系统实现资源平...
plm系统   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用