首页 文章

Python REST(Web服务)框架的建议? [关闭]

提问于
浏览
321

是否有一个列表,其中包含不同的基于Python的REST框架的建议,以便在服务器端使用以编写自己的RESTful API?优先考虑利弊 .

请随时在此处添加推荐 . :)

16 回答

  • 23

    在设计RESTful API时需要注意的是GET和POST的混合,就好像它们是同一个东西 . 使用Djangofunction-based viewsCherryPy的默认调度程序很容易犯这个错误,尽管这两个框架现在都提供了解决此问题的方法(分别为class-based viewsMethodDispatcher) .

    在REST中HTTP-verbs are very important,除非你're very careful about this, you' ll最终落入REST anti-pattern .

    一些正确的框架是web.pyFlaskBottle . 当与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!
    

    Update (April 2012) :添加了有关Django 's class-based views, CherryPy'的MethodDispatcher和Flask and Bottle框架的信息 . 当问到这个问题时,两者都不存在 .

  • 0

    惊讶没有人提到flask .

    from flask import Flask
    app = Flask(__name__)
    
    @app.route("/")
    def hello():
        return "Hello World!"
    
    if __name__ == "__main__":
        app.run()
    
  • 192

    我们将Django用于RESTful Web服务 .

    请注意 - 开箱即用 - Django没有足够的细粒度认证来满足我们的需求 . 我们使用了Django-REST interface,它帮助了很多 . [我们've since rolled our own because we' d进行了如此多的扩展,以至于它已成为维护的噩梦 . ]

    我们有两种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,所以如果有帮助的话,让它们成为可调用类的一部分或编写装饰器 .

  • 8

    Python Web Frameworks维基 .

    您可能不需要完整的堆栈框架,但剩下的列表仍然很长 .

  • 8

    我真的很喜欢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的真正喜爱;这是一个完全可行的例子,_873806知道框架 . 如果您运行此代码,则可以立即在Web浏览器中查看结果;例如访问http://localhost:8080/celc_to_fahr?degrees=50将在您的网络浏览器中显示 122.0 .

  • 3

    看一眼

  • 5

    我没有看到任何理由使用Django来暴露REST api,有更轻松,更灵活的解决方案 . Django带来了很多其他的东西,并不总是需要 . 如果您只想将某些代码公开为REST服务,那么肯定不需要 .

    我个人的经验,fwiw,就是一旦你拥有一个通用的框架,你就会开始使用它的ORM,它的插件等等,因为它很容易,而且很快就会产生依赖性这很难摆脱 .

    选择一个Web框架是一个艰难的决定,我会避免选择一个完整的堆栈解决方案来暴露REST API .

    现在,如果你真的需要/想要使用Django,那么Piston是django应用程序的一个很好的REST框架 .

    话虽这么说,CherryPy看起来也很不错,但似乎比REST更多RPC .

    看看样本(我从未使用过它),如果你只需要REST,web.py可能是最好的,也是最干净的 .

  • 6

    以下是关于REST的CherryPy文档中的讨论:http://docs.cherrypy.org/dev/progguide/REST.html

    特别是它提到了一个名为MethodDispatcher的内置CherryPy调度程序,它根据HTTP动词标识符(GET,POST等)调用方法 .

  • 8

    2010年,Pylons和repoze.bfg社区"joined forces"创建了Pyramid,这是一个最基于repoze.bfg的Web框架 . 它保留了其父框架的哲学,可用于RESTful services . 值得一看 .

  • 2

    Piston是用于为Django应用程序创建RESTful API的非常灵活的框架 .

  • 6

    似乎所有类型的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<pk>[^/]+)/$', InstanceModelView.as_view(resource=MyResource)),
    )
    

    以官方网站为例,以上所有代码都提供api,自我解释文档(如基于soap的webservice)甚至沙箱进行测试 . 非常方便 .

    链接:http://django-rest-framework.org/

  • 3

    我不是python世界的专家,但我一直在使用django这是一个优秀的Web框架,可以用来创建一个宁静的框架 .

  • 5

    web2py包括对轻松构建RESTful API的支持,描述为herehere(视频) . 特别是,请查看parse_as_rest,它允许您定义将请求args映射到数据库查询的URL模式;和smart_query,它使您能够在URL中传递任意自然语言查询 .

  • 70

    我正在使用Django然后你可以考虑django-tastypie作为django-piston的替代品 . 调整到非ORM数据源比活塞更容易,并且具有很好的documentation .

  • 11

    我强烈推荐使用TurboGears或Bottle:

    TurboGears的:

    • 比django简洁

    • 更灵活,更少面向HTML

    • 但是:不那么出名

    瓶子:

    • 非常快

    • 非常容易学习

    • 但是:简约而不成熟

  • 0

    我们正在开发一个严格的REST服务框架,请查看http://prestans.googlecode.com

    它在早期的Alpha中,我们正在测试mod_wsgi和谷歌的AppEngine .

    寻找测试人员和反馈 . 谢谢 .

相关问题