Flask 学习-49.Flask-RESTX 使用 namespaces 命名空间

前言

本页介绍了构建一个稍微复杂的 Flask-RESTPlus 应用程序,该应用程序将涵盖在设置实际基于 Flask-RESTPlus 的 API 时的一些最佳实践。

多个namespaces 命名空间

组织 Flask-RESTPlus 应用程序有很多不同的方法,但在这里我们将描述一种可以很好地扩展大型应用程序并保持良好级别组织的方法。
Flask-RESTPlus 提供了一种使用与 Flask 的蓝图几乎相同的模式的方法。主要思想是将您的应用程序拆分为可重用的命名空间。

这是一个示例目录结构:

project/
├── app.py
├── core
│   ├── __init__.py
│   ├── utils.py
│   └── ...
└── apis
    ├── __init__.py
    ├── namespace1.py
    ├── namespace2.py
    ├── ...
    └── namespaceX.py

app 模块将作为遵循经典 Flask 模式之一的主应用程序入口点.
core 模块是一个例子,它包含业务逻辑。实际上,您可以随意调用它,并且可以有很多包。
apis包将是您需要在应用程序上导入和注册的主要 API 入口点,而命名空间模块是可重用的命名空间,其设计类似于 Flask 的蓝图。

namespace 命名空间模块包含模型和资源声明。例如:

from flask_restx import Namespace, Resource, fields

api = Namespace('cats', description='Cats related operations')

cat = api.model('Cat', {
    'id': fields.String(required=True, description='The cat identifier'),
    'name': fields.String(required=True, description='The cat name'),
})

CATS = [
    {'id': 'felix', 'name': 'Felix'},
]

@api.route('/')
class CatList(Resource):
    @api.doc('list_cats')
    @api.marshal_list_with(cat)
    def get(self):
        '''List all cats'''
        return CATS

@api.route('/<id>')
@api.param('id', 'The cat identifier')
@api.response(404, 'Cat not found')
class Cat(Resource):
    @api.doc('get_cat')
    @api.marshal_with(cat)
    def get(self, id):
        '''Fetch a cat given its identifier'''
        for cat in CATS:
            if cat['id'] == id:
                return cat
        api.abort(404)

apis.__init__模块应该聚合它们:

from flask_restx import Api

from .namespace1 import api as ns1
from .namespace2 import api as ns2
# ...
from .namespaceX import api as nsX

api = Api(
    title='My Title',
    version='1.0',
    description='A description',
    # All API metadatas
)

api.add_namespace(ns1)
api.add_namespace(ns2)
# ...
api.add_namespace(nsX)

您可以在 API 中注册命名空间时为命名空间定义自定义 url 前缀。在声明命名空间对象时,您不必绑定 url-prefix。

from flask_restx import Api

from .namespace1 import api as ns1
from .namespace2 import api as ns2
# ...
from .namespaceX import api as nsX

api = Api(
    title='My Title',
    version='1.0',
    description='A description',
    # All API metadatas
)

api.add_namespace(ns1, path='/prefix/of/ns1')
api.add_namespace(ns2, path='/prefix/of/ns2')
# ...
api.add_namespace(nsX, path='/prefix/of/nsX')

使用这种模式,您只需像这样在app.py中注册您的 API :

from flask import Flask
from apis import api

app = Flask(__name__)
api.init_app(app)

app.run(debug=True)
posted @ 2022-09-05 15:57  上海-悠悠  阅读(828)  评论(0编辑  收藏  举报