前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask 学习-49.Flask-RESTX 使用 namespaces 命名空间

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

作者头像
上海-悠悠
发布2022-09-13 15:45:10
9650
发布2022-09-13 15:45:10
举报
文章被收录于专栏:从零开始学自动化测试

前言

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

多个namespaces  命名空间

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

这是一个示例目录结构:

代码语言:javascript
复制
project/
├── app.py
├── core
│   ├── __init__.py
│   ├── utils.py
│   └── ...
└── apis
    ├── __init__.py
    ├── namespace1.py
    ├── namespace2.py
    ├── ...
    └── namespaceX.py

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

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

代码语言:javascript
复制
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模块应该聚合它们:

代码语言:javascript
复制
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。

代码语言:javascript
复制
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 :

代码语言:javascript
复制
from flask import Flask
from apis import api

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

app.run(debug=True)

2022年第 12期《python接口web自动化+测试开发》课程,9月17号开学!

本期上课时间:2022年9月17号 - 2022年12月17号,周六周日上午9:00-11:00

报名费:报名费3000一人(周期3个月)

联系微信/QQ:283340479

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 多个namespaces  命名空间
    • 报名费:报名费3000一人(周期3个月)
      • 联系微信/QQ:283340479
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档