• Flask 学习49.FlaskRESTX 使用 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)
    
  • 相关阅读:
    一些C++11语言新特性
    项目管理计划应该包括哪些内容
    真相令人震惊!为什么越有钱的人,欠的钱越多?
    80后小伙返乡创业种植中药材,带领乡亲们脱贫致富
    Tableau
    知识点汇总
    决策树分析、EMV(期望货币值)
    信息系统项目管理师60天冲刺复习计划,2019下半年高项冲刺计划
    【系统分析师之路】系统分析师备考计划
    有一种规律:“劣币驱逐良币”,“坏人淘汰好人”(深度)
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/16658491.html
Copyright © 2020-2023  润新知