使用 Flask 创建 RESTful API?

Creating a RESTful API using Flask?

Flask 教程站点 here 说要创建 RESTful API,您可以编写 class 扩展 restful.Resource 的元素,然后添加它们API 通过:

app = Flask(__name__)
api = restful.Api(app)
class HelloWorld(restful.Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

但是,我看过很多教程,它们都只使用带有 @app.route('/path') 装饰器的函数,我更习惯在 Flask 应用程序中看到它。例如,here,他们有:

@app.route('/todo/api/v1.0/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

here

@app.route('/')
def api_root():
    return 'Welcome'

使用 restful.Resource class 和只使用装饰函数有什么区别?如果没有差异,我应该按照惯例做什么来创建 RESTful API?

简答:

restful.Resource是从一个Flask-Restful extension, which is not Flask itself. Miguel's tutorial uses Flask写一个restful接口。

长答案:

首先,除了Flask,还有一些Flask extensions。尽管它们协同工作,但它们是独立的包,并且由各个作者编写。 Flask-RestfulFlask.

的扩展

Miguel 的教程解释了如何单独使用 Flask 制作 restful api。

Flask-Restful with the aim to saving some of us from re-inventing the wheel, promises to turn a custom class(or a custom Python data structure) to a restful web service. Flask-RESTXFlask-Restful 的一个分支,使用 swagger UI 自动生成 api 文档。

此外,Flask 还documented the usage of MethodView to allow developers to write their own restful APIs. In parallel, Flask-Restless 承诺将 SqlAlchemy class 转变为 restful 网络服务。

更新(18/07/2016),flask-api turns a function/view into a restful interface and is designed by Tom Christie, the author of django restful framework

一个更新(17/03/2021),Flask-RESTPlus 做一些与上述库相似的事情,但它也可以帮助你构建 swagger API 文档,这是一个额外的好处。

通往罗马的道路很多

当需要大量端点时,使用方法而不是 类 会很快变得混乱。 Classes/resource 是分离和解耦逻辑的更好方法。此外,您的代码变得更易读,更易于 change/fix

使用 flask-restful 可能是最好的方法,尽管我还有一些工作要做,以便为您的 api 创建蓝图、配置路由、处理请求参数,以及每个普通人 api 都需要的许多东西,这很烦人。

我在 flask-restful 之上构建了这个轻量级框架,让您可以轻松构建 restful apis 而无需担心所有需要的布线,只需专注于定义您的 api 和编写业务逻辑。你可以在这里查看:https://github.com/sebastiandev/peach

它更面向NOSQL数据库,但那只是因为默认提供的数据库代理是针对mongodb的,如果您需要sql,您可以为sql做一个代理sqlchemy(或者等我有时间来构建它)。

#from flask import Flask

app = Flask(__name__)

@app.route('/')

def index():

    return "Hello, World!"

if __name__ == '__main__':

    app.run(debug=True)