将资源绑定到端点

时间:2018-05-01 17:11:23

标签: python flask flask-restful

据我所知,到目前为止,有两种方法可以使用flask框架将资源绑定到端点, 第一个是使用@app.route装饰器,如下所示:

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello, World!'

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

第二种方法是在flask-restfull中创建一个继承自Resources的类,该类包含http方法作为函数,我们使用add_resource方法将其绑定到端点,如下所示:

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class HelloWorld(Resource):
    def get(self):
        return 'Hello, World!'

api.add_resource(HelloWorld, '/')

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

据我所知,这两种不同的语法做同样的事情,我不明白两者之间有什么区别?或者是针对特定类型的应用而设计的,另一种是针对其他类型的应用而设计的?

1 个答案:

答案 0 :(得分:1)

Flask-RESTful是Flask的扩展,它本身是基于Werkzeug提供的许多出色实用程序构建的。

from flask import Flask
app = Flask(__name__)

@app.route('/foo')
def say_foo():
    return 'foo'

@app.route('/bar')
def say_bar():
    return 'bar'

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

REST背后的最大创意之一就是使用HTTP与资源进行交互。这段代码的问题是我们的资源被划分为多种方法。没有封装。尽管API本身包含REST的基本元素,但是代码完全无法捕获这些想法。这是不好的!我们的内部代码没有理由不应该与API的外观相匹配。

使用Flask-RESTful

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class Foo(Resource):
    def get(self):
        return 'foo'

class Bar(Resource)
def get(self):
    return 'bar'

# As you might have guessed, these two lines add a given resource to our API at the 
# specified route. We no longer need to enumerate what methods a route supports, 
# since Flask-RESTful resolves this information by inspecting what methods you've 
# defined on your resource object.

api.add_resource(Foo, '/foo')
api.add_resource(Bar, '/bar')

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

我们现在有课!这是一笔大买卖。现在,我们的路线直接映射到对象。更好的是,给定类上的方法与它们的HTTP对应方法完全相同。我们不再需要像say_foo这样的路由上处理命名方法,因为HTTP方法与类中的方法之间存在一对一的映射。

了解更多:https://dougblack.io/words/flask-restful-101.html