有某处的在 serverside 上使用不同的基于 Python 的其余部分框架的建议,以编写您自己的 rest 风格 Api 列表吗?最好有优点和缺点。

请随意添加下面的建议。:)

2009-04-03 13:13:23
问题评论:

哇,为什么有人认为这不建设性?请不要关闭它。

我认为是非常清楚说明。

因此我认为的 @flossfan 真的缺少此类东西上的了船。在已关闭的原因的解释。"我们希望事实、 引用或特定的专业技能,所支持的答案,但这个问题可能会要求辩论、 参数、轮询,或扩展的讨论。"轮询并与主题有"特定的专业技能"的人询问意见的问题所在。我的意思是,如果他们不轮询,然后拿走向上和向下投票。对于轮询就是 !它是让哪个答案自己喜欢或事物最好说 (即轮询) 的开发人员。

我尝试研究 Python、 打开 3 stackoverflow 链接行中的 150 + 的得分,"关闭不建设性 casperOne"...这三个非常建设性。

我有几乎相同的体验,blesh 编写有关,但实际上我不记得当我没有见过"封闭作为没有建设性",但他们全部已经非常有用 !我的作业,但这样使用最好的工具是所有听起来拒绝被用于别处比钉子的锤子...唯一的钉子 !

回答:

必须小心设计一个 rest 风格的 API 时有的 GET 和 POST,conflation,就像同样的事情。尽管现在这两种框架提供了解决此问题的方法很容易地与Django基于函数的视图CherryPy的默认调度程序,此犯 (基于类的视图MethodDispatcher,分别)。

其余部分, HTTP 谓词都非常重要,除非你非常小心,对此,最终会落在余料反模式.

就一些框架是web.pyFlask瓶子结合mimerender库 (完全披露︰ 我写了),它们可用于编写好 rest 风格的 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 和瓶子的框架。既不存在时所提出的问题。

这是不正确,Django 已完全支持识别开机自检与获取和限制到只有某些方法的视图。

我意味着,默认情况下,Django 对待开机自检并获得同样的工作,这是非常不方便,在执行 rest 风格的服务,因为它会强制您执行时一样︰ 如果 request.method = = GET: do_something() elif request.method = = 公告: do_something_else() web.py 不会有这个问题

@Wahnfrieden︰ 如果没有本机支持 Django 分别处理不同的 HTTP 谓词 (由"本地"我的意思是不需要"如果 request.method==X"),可能您请指向我一些文档?

开机自检和 GET conflation 不适用于 Django 的类基于视图 (添加在 1.3),但我相信是对早期版本有效。

答案是不正确有关 CherryPy。从文档:"其余部分 (Representational 状态转移) 是非常适合在 CherryPy 的实现体系结构风格"- docs.cherrypy.org/dev/progguide/REST.html

没有人提到flask惊讶.

from flask import Flask
app = Flask(__name__)

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

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

Flask 那里没有时提出的问题是...

Flask 不使用 Python 3.x

Flask.dev 现在支持 Python 3

Flask支持 Python 3.3或更高版本。

noob 这是 RESTful 这里吗?

我们使用Django的 rest 风格的 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,因此使这些部分可调用的类或写修饰器,如果它有帮助。

简直太重复的 d = someUsefulThing...即使 Django 专家建议干。

@temoto︰ 如果y = someUsefulThing(...)为"简直太重复,",则对所有函数和方法的所有引用都是"厌恶"。我无法理解如何避免引用函数不止一次。

@temoto:"当您需要更改传递给 someUsefulThing 的参数中时,没有一个忘记了这样做的所有调用中有机会"?什么?这是"厌恶"?这就是普通多次引用函数的结果。我不能理解您所说的内容和方式函数引用是"厌恶"的因为它会不可避免地。

请参阅接受的答案。结果表达式 {消息: 大家好,' + 名称 + ' !} 一次面向所有演示文稿。

HtmlView 和 jsonView 函数为右的相同数据的不同表示形式提供服务?因此, someUsefulThing(request, object_id)是数据检索表达式。现在您有两份相同的表达式中的不同时间点在您的程序中。已接受的答案,数据表达式写入一次。替换someUsefulThing调用一个长字符串,像paginate(request, Post.objects.filter(deleted=False, owner=request.user).order_by('comment_count')) ,看看代码。我希望它将阐释我的观点。

请参阅Python Web 框架wiki。

您可能不需要完全的堆栈框架中,但其余列表仍然很长。

我的确很喜欢CherryPy这里是一个 rest 风格的 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? 度 = 50将在 web 浏览器中显示122.0

这是一个很好的示例,但没有 RESTful 而已。

@Wahnfrieden︰ 可能有助于其他人出通过阐明为什么您不认为上面是 RESTful 吗?从我的角度看,它看起来像典型的其余部分并没有破坏任何规则或约束的 rest 风格的系统。

简单地说,上面的 CherryPy 示例中正在执行的操作将公开方法为"HTTP 调用"远程过程。这是 RPC。它完全是面向"谓词"。Rest 风格的体系结构重点由服务器管理的资源,然后提供非常有限的一组对这些资源的操作︰ 专、 开机自检 (创建),GET (读取)、 PUT (更新) 和删除 (删除)。这些资源,尤其是改变传,通过其状态的操作是关键的小路,由此,"东西"产生影响。

您可以编写更多 RESTfull Api 使用 CherryPy docs.cherrypy.org/stable/progguide/REST.html

请输入您的翻译

Recommendations of Python REST (web services) framework? [closed]

确认取消