烧瓶绑定资源到端点

flask binding resource to an endpoint

据我所知,目前有两种使用 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的class,这个class包含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()

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

Flask-RESTful 是 Fl​​ask 的扩展,它本身建立在 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()

我们现在有 class 个!这是一件大事。我们的路线现在直接映射到对象。更好的是,给定 class 上的方法与其对应的 HTTP 方法完全相同。我们不再需要像 say_foo 那样在路由上处理命名方法,因为 HTTP 方法和 classes 上的方法之间存在一对一的映射。

阅读更多:https://dougblack.io/words/flask-restful-101.html