如何在 Flask API 路由系统中定义基本路由
Posted
技术标签:
【中文标题】如何在 Flask API 路由系统中定义基本路由【英文标题】:How to define a base route in Flask API routing system 【发布时间】:2015-01-25 05:18:00 【问题描述】:在像 slim php 框架这样的框架中,您可以定义在所有路由中都相同的基本路由,例如 /api/v1
。
所以在 slim 中,我们可以对路由进行分组,而不是在每条路由中添加 /api/v1
:
$app->group('/api/v1', function () use ($app)
// Get book with ID
$app->get('/books/:id', function ($id)
);
// Update book with ID
$app->put('/books/:id', function ($id)
);
// Delete book with ID
$app->delete('/books/:id', function ($id)
);
);
但在 Flask 中,我找不到一种简单的方法来分组路线。如果我必须在我调用的每个资源中写 /api/v1
怎么办?有没有办法将它们分组?
在 python 中我应该使用类似下面的东西:
class TaskListAPI(Resource):
def get(self):
pass
def post(self):
pass
class TaskAPI(Resource):
def get(self, id):
pass
def put(self, id):
pass
def delete(self, id):
pass
api.add_resource(TaskListAPI, '/api/v1/tasks', endpoint = 'tasks')
api.add_resource(TaskAPI, '/api/v1/tasks/<int:id>', endpoint = 'task')
【问题讨论】:
【参考方案1】:虽然Blueprints 很棒,但您似乎正在寻找更具体的扩展,以满足您构建一个在 HTTP 方法之间轻松区分的 API 的愿望。
您可能想看看Flask-Classy,这是一个烧瓶扩展,它就是这样做的。您可以为每个资源创建一个类(就像您在伪代码中描述的那样)并在 http 方法上有所不同:
from flask_classy import FlaskView
class TaskView(FlaskView):
def index(self):
"""Return a list of all tasks."""
pass
def get(self, id):
"""Get a specific task."""
pass
def delete(self, id):
"""Delete the task."""
pass
TaskView.register(app)
此外,如果您有特殊情况,Flask-Classy 还支持很多customize the endpoints 的方式。
【讨论】:
【参考方案2】:我想你正在寻找Blueprints。蓝图是将您的应用程序分成几个较小部分的好方法 - 例如,您可能有一个用于 Web 应用程序的“主”蓝图、一个用于管理界面的“管理”蓝图和一个用于 RESTful API 的“api”蓝图.
【讨论】:
据我所知蓝图使用for making application components and supporting common patterns within an application or across applications. Blueprints can greatly simplify how large applications work
以上是关于如何在 Flask API 路由系统中定义基本路由的主要内容,如果未能解决你的问题,请参考以下文章