当前位置:  开发笔记 > 编程语言 > 正文

Python REST(Web服务)框架的建议?

如何解决《PythonREST(Web服务)框架的建议?》经验,为你挑选了11个好方法。

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

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



1> Martin Blech..:

在设计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/x
Hello, 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框架的信息.当问到这个问题时,两者都不存在.


我的意思是,默认情况下,Django将POST和GET视为同一个东西,当你执行RESTful服务时非常不方便,因为它迫使你这样做:if request.method =='GET':do_something() elif request.method =='POST':do_something_else()web.py没有那个问题
@Wahnfrieden:如果Django中有原生支持单独处理不同的HTTP动词(通过"native"我的意思是不需要"if request.method == X"),你能指点我一些文档吗?
这是不正确的,Django完全支持识别POST与GET并仅限于某些方法的视图.
POST和GET的混合不适用于Django的基于类的视图(在1.3中添加),但我认为对早期版本有效.

2> 小智..:

惊讶没人提到烧瓶.

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()


当问到这个问题时,烧瓶不在那里......
Flask.dev现在支持Python 3
noob在这里,这是一个RESTful?
**Flask不适用于Python 3.x**
Flask [支持Python 3.3](http://flask.pocoo.org/docs/python3/)或更高版本.

3> S.Lott..:

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


@temoto:如果`y = someUsefulThing(...)`是一个"可怕的重复",那么对所有函数和方法的所有引用都是"糟糕的".我不明白如何避免**多次引用**函数.
@temoto:"当你需要更改传递给someUsefulThing的参数时,有可能忘记在所有调用中这样做"?什么?那"糟糕"怎么样?这不仅仅是一次引用函数的一个微不足道的结果.我无法理解你在说什么以及函数引用是如何"糟糕"的,因为它是不可避免的.
看到接受的答案.结果表达式{'message':'Hello,'+ name +'!'}为所有演示文稿写入一次.
您的htmlView和jsonView函数为相同的数据提供不同的表示,对吧?所以`someUsefulThing(request,object_id)`是一个数据检索表达式.现在,您在程序的不同点上有两个相同表达式的副本.在接受的答案中,数据表达式被写入一次.用长字符串替换你的`someUsefulThing`调用,比如`paginate(request,Post.objects.filter(deleted = False,owner = request.user).order_by('comment_count'))`并查看代码.我希望它能说明我的观点.
糟糕的重复d = someUsefulThing ......甚至Django家伙都建议DRY.
你试着写那个长篇大论吗?(兄弟姐妹的两次功能)?
好吧,我想它需要纸张和视觉接触来解释我的观点.
你不断重复它是关于函数引用.我一直在重复它不是.是的,许多函数引用很好(就像我们使用`unicode`和`min`这么多次,它很好).许多重复的表达式不是(比如重复``debug:"+ str(this)`,这是邪恶的).你了解`str`和`"debug:"+ str(foo)`之间的区别吗?

4> gimel..:

请参阅Python Web框架维基.

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



5> Eli Courtwri..:

我真的很喜欢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浏览器中.


简单来说,上面的CherryPy示例正在做的是将方法暴露为"HTTP可调用"远程过程.这是RPC.它完全以"动词"为导向.RESTful架构专注于由服务器管理的*资源*,然后在这些资源上提供非常有限的*操作集:特别是POST(创建),GET(读取),PUT(更新)和DELETE(删除).操纵这些资源,特别是通过PUT改变它们的*状态*是"发生事情"的关键途径.
这是一个很好的例子,但没有任何关于它的RESTful.
@Wahnfrieden:你可以通过澄清为什么你不认为上述是RESTful来帮助我们其他人吗?从我的角度来看,它看起来像是REST的经典示例,并且似乎没有破坏RESTful系统的任何规则或约束.
您可以使用CherryPy编写更多RESTfull API http://docs.cherrypy.org/stable/progguide/REST.html

6> z8000..:

看一眼

Itty(博客文章)

瓶子

web.py

朱诺



7> Savino Sguer..:

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

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

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

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

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

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



8> 小智..:

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

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



9> asthasr..:

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



10> DenisKolodin..:

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



11> Sun Liwen..:

似乎各种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/


特别是可浏览界面在开发过程中节省了大量时间!许多其他优点,所以每个人开始休息实施应该看看.我从tastypie开始,但完全切换到django-rest-framework
推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有