【问题标题】:Creating a RESTful API using Flask?使用 Flask 创建 RESTful API?
【发布时间】:2015-03-17 21:50:26
【问题描述】:

Flask 教程网站here 说,要创建一个 RESTful API,您需要编写扩展 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 类与仅使用修饰函数(如果有)有什么区别?如果没有差异,我应该按照惯例做什么来创建 RESTful API?

【问题讨论】:

  • restful.Resource 源自 Flask 扩展。 app.route 是基于纯 Flask 的解决方案(您可以通过这种方式非常轻松地实现简单的 API)。添加 simple API exceptions 之类的基本解决方案后,对于简单的 API 来说已经足够了。
  • @ujvl Flask Tuto 的链接已失效。

标签: python api rest flask


【解决方案1】:

简答

restful.Resource 来自 Flask-Restful 扩展,它不是 Flask 本身。 Miguel's tutorial 使用Flask 编写一个restful接口。

长答案

首先,除了Flask,还有很多Flask extensions。尽管它们一起工作,但它们是独立的包,由各个作者编写。 Flask-RestfulFlask 的扩展。

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

Flask-Restful 旨在让我们中的一些人免于重新发明轮子,承诺将自定义类(或自定义 Python 数据结构)转变为宁静的 Web 服务。 Flask-RESTXFlask-Restful 的一个分支,使用 swagger UI 自动生成 api 文档。

此外,Flask 还documented 使用了MethodView 来让开发者编写自己的restful API。同时,Flask-Restless 承诺将 SqlAlchemy 类转变为一个安静的 Web 服务。

更新(18/07/2016),flask-api 将功能/视图变成了一个宁静的界面,由 django restful framework 的作者 Tom Christie 设计。

更新 (17/03/2021),Flask-RESTPlus 与上述库类似,但它还可以帮助您构建 swagger API 文档,这是一个额外的好处。

通往罗马的道路很多

【讨论】:

    【解决方案2】:

    当需要大量端点时,使用方法而不是类会很快变得混乱。类/资源是分离和解耦逻辑的更好方法。此外,您的代码变得更具可读性和更容易更改/修复

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

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

    它更面向 NOSQL 数据库,但这只是因为默认的数据库代理是 mongodb,如果你需要 sql,你可以为 sqlachemy 做一个代理(或者等到我有时间构建它)。

    【讨论】:

      【解决方案3】:
      #from flask import Flask
      
      app = Flask(__name__)
      
      @app.route('/')
      
      def index():
      
          return "Hello, World!"
      
      if __name__ == '__main__':
      
          app.run(debug=True)
      

      【讨论】:

      • 这与问题无关。
      猜你喜欢
      • 2015-05-14
      • 2017-01-12
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多