OpenAPI 生成¶
OpenAPI(最初称为 Swagger 规范)是一个流行的 REST API 描述规范。APIFlask 内置支持 OpenAPI。本章将介绍在 APIFlask 中生成 OpenAPI 的基本用法。
代码优先或设计优先
使用 OpenAPI 时有两种方法:代码优先和设计优先。APIFlask 当前仅支持代码优先的方法。它会在你编写代码后为你生成 OpenAPI spec 。我们计划在 1.0 版本发布后支持设计优先的方法。
OpenAPI 支持的概览¶
APIFlask 从配置值、已注册的路由以及通过装饰器传递的信息中收集数据,然后基于这些信息生成 OpenAPI spec。
| 字段名称 | APIFlask 的生成方式 | 如何自定义 |
|---|---|---|
| openapi | - | 使用配置变量 OPENAPI_VERSION |
| info | - | 参见 元信息 |
| servers | - | 使用配置变量 SERVERS |
| paths | 根据路由和装饰器生成 | 使用 input、output、doc 装饰器和文档字符串 |
| components | 从数据模式生成 | - |
| security | 根据认证对象生成安全信息 | 使用 auth_required 装饰器 |
| tags | 根据蓝本名称生成 | 参见 标签 |
| externalDocs | - | 使用配置变量 EXTERNAL_DOCS |
它提供了三种方式获取 spec 文档(规范文档,即 specification document,指存储 OpenAPI 规范的 JSON 或 YAML 文件,后文会简称为 spec)文件:
- 一个返回字典格式 spec 的
app.spec属性。 - 一个提供 spec 的端点。
- 一个
flask spec命令,用于将 spec 输出到标准输出或文件。
此外,它还提供了一个 app.spec_processor 装饰器,你可以使用它注册一个 spec 处理函数,在返回 spec 之前更新它。详情请参见 注册 spec 处理器。
自动化行为¶
在从代码生成 OpenAPI spec 时,APIFlask 具有以下自动化行为:
- 从视图函数名称生成默认的 operation 摘要(summary)。
- 从视图函数的文档字符串生成默认的 operation 描述。
- 从蓝本名称生成标签。
- 为注册到应用程序的任何视图添加默认的 200 响应。
- 如果视图使用了
app.input装饰器,则添加 422 响应。 - 如果视图使用了
app.auth_required装饰器,则添加 401 响应。 - 如果视图的 URL 规则包含变量,则添加 404 响应。
所有这些自动化行为都可以通过 相应的配置 禁用。
spec 格式¶
OpenAPI spec 的默认格式是 JSON,同时也支持 YAML。如果你想启用 YAML 支持,请安装带有 yaml 额外依赖的 APIFlask(它会安装 PyYAML):
$ pip install "apiflask[yaml]"
现在你可以通过 SPEC_FORMAT 配置更改格式:
from apiflask import APIFlask
app = APIFlask(__name__)
app.config['SPEC_FORMAT'] = 'yaml'
spec 端点的默认 URL 路径是 /openapi.json,如果你想使用 YAML 格式,也可以更新它:
from apiflask import APIFlask
app = APIFlask(__name__, spec_path='/openapi.yaml')
app.config['SPEC_FORMAT'] = 'yaml'
SPEC_FORMAT 配置还会控制 flask spec 命令的 spec 格式输出。
JSON spec 的缩进¶
当你通过 /openapi.json 从浏览器查看 spec 时,如果启用了调试模式或将配置变量 JSONIFY_PRETTYPRINT_REGULAR 设置为 True,缩进将设置为 2。否则,为了节省带宽和加快请求速度,JSON spec 将以无缩进和空格的形式发送。
本地 spec 文件的缩进默认启用。默认缩进值是 LOCAL_SPEC_JSON_INDENT 配置的默认值(即 2)。当你使用 flask spec 命令时,可以通过 --indent 或 -i 选项更改缩进。
YAML spec 的缩进始终为 2,目前无法更改。
app.spec 属性¶
你可以通过 app.spec 属性以字典格式获取 spec 。它将始终返回最新的 spec :
>>> from apiflask import APIFlask
>>> app = APIFlask(__name__)
>>> app.spec
{'info': {'title': 'APIFlask', 'version': '0.1.0'}, 'tags': [], 'paths': OrderedDict(), 'openapi': '3.0.3'}
>>> @app.get('/')
... def hello():
... return {'message': 'Hello'}
...
>>> app.spec
{'info': {'title': 'APIFlask', 'version': '0.1.0'}, 'tags': [], 'paths': OrderedDict([('/', {'get': {'parameters': [], 'responses': OrderedDict([('200', {'content': {'application/json': {'schema': {}}}, 'description': 'Successful response'})]), 'summary': 'Hello'}})]), 'openapi': '3.0.3'}
>>>
spec 端点¶
默认情况下,spec 以 JSON 格式提供,并可通过 URL 路径 /openapi.json 访问。你可以通过 spec_path 参数更改 spec 端点的 URL 规则:
from apiflask import APIFlask
app = APIFlask(__name__, spec_path='/spec')
然后,spec 将可通过 http://localhost:5000/spec 访问。
Tip
你可以通过配置变量 YAML_SPEC_MIMETYPE 和 JSON_SPEC_MIMETYPE 配置 spec 响应的 MIME 类型,详情请参见 配置文档。
flask spec 命令¶
版本 >= 0.7.0
此功能在 版本 0.7.0 中添加。
执行 flask spec 命令时,spec 将输出到标准输出:
$ flask spec
执行 flask spec --help 查看此命令的完整 API 参考:
$ flask spec --help
如果你已经执行了上述命令,可以跳过接下来的三个小节。
将 spec 输出到文件¶
如果使用 --output 或 -o 选项提供路径,APIFlask 将把 spec 写入到指定路径:
$ flask spec --output openapi.json
没有这样的文件或目录?
如果指定的路径不存在,你需要自行创建目录,APIFlask 将为你创建文件。
你还可以通过配置变量 LOCAL_SPEC_PATH 设置路径,当未传递 --output/-o 选项时,此值将用于 flask spec 命令:
from apiflask import APIFlask
app = APIFlask(__name__)
app.config['LOCAL_SPEC_PATH'] = 'openapi.json'
$ flask spec
更改 spec 格式¶
同样,可以通过 --format 或 -f 选项设置 spec 格式(默认为 json):
$ flask spec --format json
你还可以通过配置变量 SPEC_FORMAT(默认为 'json')设置格式,当未传递 --format/-f 选项时,此值将用于 flask spec 命令:
from apiflask import APIFlask
app = APIFlask(__name__)
app.config['SPEC_FORMAT'] = 'yaml'
$ flask spec
更改本地 JSON spec 的缩进¶
对于本地 spec 文件,缩进始终是必要的,以便于阅读和跟踪更改。可以通过 --indent 或 -i 选项设置缩进:
$ flask spec --indent 4
你还可以通过配置变量 LOCAL_SPEC_JSON_INDENT(默认为 2)设置缩进,当未传递 --indent/-i 选项时,此值将用于 flask spec 命令:
from apiflask import APIFlask
app = APIFlask(__name__)
app.config['LOCAL_SPEC_JSON_INDENT'] = 4
$ flask spec
抑制 spec 输出¶
版本 >= 2.1.1
此功能在 版本 2.1.1 中添加。
如果你希望将 spec 写入本地文件而不同时打印到标准输出,可以指定 --quiet/-q 选项:
$ flask spec --output openapi.json --quiet
保持本地 spec 同步¶
版本 >= 0.7.0
此功能在 版本 0.7.0 中添加。
通过 flask spec 命令,你可以轻松地将 spec 生成到本地文件中。如果希望 spec 文件与项目代码保持同步,可以设置配置 LOCAL_SPEC_PATH 的路径,然后通过将配置 SYNC_LOCAL_SPEC 设置为 True 来启用同步:
from apiflask import APIFlask
app = APIFlask(__name__)
app.config['SYNC_LOCAL_SPEC'] = True
app.config['LOCAL_SPEC_PATH'] = 'openapi.json'
Warning
如果你传递的路径是相对路径,请不要在路径前加斜杠。
APIFlask 将在你当前的工作目录(执行 flask run 命令的目录)中创建文件。我们建议使用绝对路径。例如,你可以使用 app.root_path,它存储了应用模块的绝对根路径:
from pathlib import Path
app = APIFlask(__name__)
app.config['SYNC_LOCAL_SPEC'] = True
app.config['LOCAL_SPEC_PATH'] = Path(app.root_path) / 'openapi.json'
Tip
你还可以使用 app.instance_path,如果你的应用位于包中,它将非常有用,因为它返回位于项目根路径的实例文件夹路径。
或者使用 os 模块:
import os
app = APIFlask(__name__)
app.config['SYNC_LOCAL_SPEC'] = True
app.config['LOCAL_SPEC_PATH'] = os.path.join(app.root_path, 'openapi.json')
如果你使用应用工厂并根据当前模块的 __file__ 变量手动找到项目根路径,可以这样操作:
from pathlib import Path
base_path = Path(__file__).parent
# 如果你的配置模块位于应用包中,可能需要使用以下代码:
# base_path = Path(__file__).parent.parent
SYNC_LOCAL_SPEC = True
LOCAL_SPEC_PATH = base_path / 'openapi.json'
或者使用 os 模块:
import os
base_path = os.path.dirname(__file__)
# 如果你的配置模块位于应用包中,可能需要使用以下代码:
# base_path = os.path.dirname(os.path.dirname(__file__))
SYNC_LOCAL_SPEC = True
LOCAL_SPEC_PATH = os.path.join(base_path, 'openapi.json')
元信息¶
可以在创建 APIFlask 实例时通过参数设置 title 和 version 字段:
from apiflask import APIFlask
app = APIFlask(__name__, title='我的 API', version='1.0')
info 对象中的其他字段可以通过以下配置变量设置:
DESCRIPTIONTERMS_OF_SERVICECONTACTLICENSE
你还可以通过 INFO 一次性设置以上四个字段。
有关详细信息,请参阅配置文档中的 OpenAPI 字段 部分。
标签(tag)¶
默认情况下,tag 对象是基于蓝本自动生成的:
- 每个蓝本会生成一个标签,蓝本名称会被转换为标题形式作为标签名称。
- 蓝本下的所有路由会自动标记为对应的标签。
如果你希望为蓝本使用自定义标签名称或为标签添加更多详细信息,可以使用 APIBlueprint(tag=...) 参数传递新名称:
from apiflask import APIBlueprint
bp = APIBlueprint('foo', __name__, tag='新名称')
此参数也接受一个字典:
bp = APIBlueprint('foo', __name__, tag={'name': '新名称', 'description': '描述...'})
如果你不喜欢这种基于蓝本的标签系统,也可以手动设置。你可以通过配置变量 TAGS 传递一个标签名称列表:
app.config['TAGS'] = ['foo', 'bar', 'baz']
如果需要为标签添加详细信息,也可以传递一个字典列表:
app.config['TAGS'] = [
{'name': 'foo', 'description': 'foo 的描述'},
{'name': 'bar', 'description': 'bar 的描述'},
{'name': 'baz', 'description': 'baz 的描述'}
]
Tip
app.tags 属性等同于配置变量 TAGS,因此你也可以这样使用:
app.tags = ['foo', 'bar', 'baz']
设置了 TAGS 后,你可以使用 doc 装饰器为每个路由(OpenAPI operation)添加标签,详见 Operation tags。
path 和 operation¶
path 和 operation 对象中的大部分信息会根据你的视图函数或视图类自动生成,但你可能需要更改其中的一些内容。
Operation responses¶
当你在视图函数上添加 output 装饰器时,会生成 operation 的 responses:
@app.get('/pets/<int:pet_id>')
@app.output(PetOut)
def get_pet(pet_id):
return pets[pet_id]
你可以通过 output 装饰器中的 description 和 status_code 参数设置描述和状态码(默认为 200):
@app.get('/pets/<int:pet_id>')
@app.output(PetOut, status_code=200, description='宠物的输出数据')
def get_pet(pet_id):
return pets[pet_id]
operation 的 responses 对象具有以下自动化行为:
- 如果视图函数添加了
input装饰器,APIFlask 会添加一个422响应。 - 如果视图函数添加了
auth_required装饰器,APIFlask 会添加一个401响应。 - 如果视图函数仅使用路由装饰器,APIFlask 会添加一个默认的
200响应。 - 如果路由 URL 包含变量(例如
'/pets/<int:pet_id>'),APIFlask 会添加一个404响应(版本 >= 0.8)。
你可以通过相关的 配置变量 禁用或配置这些行为。
Operation 的 requestBody 和 parameters¶
当你在视图函数上添加 input 装饰器时,会生成 operation 的 requestBody:
@app.post('/pets')
@app.input(PetIn)
def create_pet(pet_id):
pass
如果你指定了请求数据的位置(非 json),则会生成 operation 的 parameters:
@app.get('/pets')
@app.input(PetQuery, location='query')
def get_pets():
pass
Operation 的 summary 和 description¶
默认情况下,APIFlask 会使用视图函数的名称作为 operation 的摘要(summary)。如果你的视图函数名为 get_pet,那么 summary 将是 "Get Pet"。
如果视图函数有文档字符串(docstring),那么文档字符串的第一行将用作 summary,文档字符串中空行之后的内容将用作 description。
设置 summary 的优先级
@app.doc(summary='自定义摘要') > 文档字符串的第一行 > 视图函数名称
以下是通过文档字符串设置 summary 和 description 的示例:
@app.get('/hello')
def hello():
"""打招呼
关于 /hello 的一些描述
"""
return 'Hello'
响应和请求的 schema¶
APIFlask(通过 apispec)会根据你传递的数据模式生成 operation 的 schema 对象。
要为模式字段设置 OpenAPI 规范,可以通过 metadata 关键字传递一个字典:
class PetIn(Schema):
name = String(metadata={'description': '宠物的名字。'})
你可以在此 metadata 字典中传递 OpenAPI 模式字段名称作为键。目前支持以下字段:
formattitledescriptiondefaultmultipleOfmaximumexclusiveMaximumminimumexclusiveMinimummaxLengthminLengthpatternmaxItemsminItemsuniqueItemsmaxPropertiesminPropertiesrequiredenumtypeitemsallOfpropertiesadditionalPropertiesreadOnlywriteOnlyxmlexternalDocsexamplenullabledeprecated- 任何以
x-前缀开头的自定义字段
有关这些字段的详细信息,请参阅 OpenAPI 文档。
然而,大多数字段会在你设置模式字段时自动生成。例如,如果你将 required 设置为 True,并为 validate 传递一个 Length(0, 10) 验证器:
from apiflask import Schema
from apiflask.fields import String
class PetIn(Schema):
name = String(
required=True,
validate=Length(0, 10),
metadata={'description': '宠物的名字。'}
)
那么在最终的规范中,type、maxLength、minLength 和 required 字段将具有正确的值:
"PetIn": {
"properties": {
"name": {
"description": "宠物的名字。",
"maxLength": 10,
"minLength": 0,
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
}
通常,你只需要通过 metadata 字典手动设置以下字段:
description:此字段的一些描述。title:字段的标题。example:此字段的示例值(属性级别示例)。deprecated:如果为 true,表示此字段已弃用。externalDocs:指向此字段的外部文档的链接。xml:添加额外的元数据以描述此字段的 XML 表示格式。详情请参阅 OpenAPI XML 对象。
Tip
如果模式类的名称以 Schema 结尾,那么在规范中将会被去掉。
响应和请求示例¶
在 API 文档中渲染规范时,文档工具会为你生成一个默认示例。如果你想添加自定义示例,可以使用 example 参数在 input/output 装饰器中传递一个字典作为响应的 example:
from apiflask import APIFlask
app = APIFlask(__name__)
@app.post('/pets')
@app.input(PetIn, example={'name': 'foo', 'category': 'cat'})
def create_pet():
pass
对于多个示例,可以使用 examples 参数并传递一个字典的字典,每个示例字典映射一个唯一名称:
from apiflask import APIFlask
app = APIFlask(__name__)
examples = {
'示例 foo': {
'summary': 'foo 的示例',
'value': {'name': 'foo', 'category': 'cat', 'id': 1}
},
'示例 bar': {
'summary': 'bar 的示例',
'value': {'name': 'bar', 'category': 'dog', 'id': 2}
},
}
@app.get('/pets')
@app.output(PetOut, examples=examples)
def get_pets():
pass
Warning
目前,input 装饰器中的 example/examples 参数仅支持 JSON 请求体。如果需要为查询数据设置自定义示例,可以在数据模式中设置字段示例(属性级别示例):
class PetQuery(Schema):
name = String(metadata={'example': 'Flash'})
响应 links¶
版本 >= 0.10.0
此功能在 版本 0.10.0 中添加。
你可以通过 output 装饰器中的 links 参数传递链接:
pet_links = {
'getAddressByUserId': {
'operationId': 'getUserAddress',
'parameters': {
'userId': '$request.path.id'
}
}
}
@app.post('/pets')
@app.output(PetOut, links=pet_links)
def new_pet():
pass
或者,你也可以将链接添加到组件中,然后在操作中引用它:
links = {
'getAddressByUserId': {
'operationId': 'getUserAddress',
'parameters': {
'userId': '$request.path.id'
}
}
}
@app.spec_processor
def update_spec(spec):
spec['components']['links'] = links
return spec
@app.post('/pets')
@app.output(PetOut, links={'getAddressByUserId': {'$ref': '#/components/links/getAddressByUserId'}})
def new_pet():
pass
响应 headers¶
版本 >= 2.1.0
此功能在 版本 2.1.0 中添加。
你可以在 output 装饰器中通过 headers 参数传递一个模式类:
class Header(Schema):
x_token = String(
data_key='X-Token',
metadata={'description': '一个自定义的 token 头'}
)
@app.post('/pets')
@app.output(PetOut, headers=Header)
def new_pet():
pass
当传递模式到 headers 时,你也可以使用字典而不是模式类:
@app.post('/pets')
@app.output(PetOut, headers={'X-Token': String(metadata={'description': '一个自定义的 token 头'})})
def new_pet():
pass
请求和响应的内容类型 / 媒体类型¶
对于请求,内容类型(media/content type)会根据输入的位置自动设置:
json:application/jsonform:application/x-www-form-urlencodedfiles,form_and_files:multipart/form-data
对于响应,默认的内容类型是 application/json。你可以通过 output() 装饰器中的 content_type 参数(APIFlask >= 1.3.0)设置自定义内容类型:
@app.post('/foo')
@app.output({FooSchema}, content_type='custom/type')
def get_foo():
pass
Note
为了与 Flask/Werkzeug 保持一致,我们使用 content_type 而不是 media_type。
文件响应¶
版本 >= 2.0.0
此功能在 版本 2.0.0 中添加。
当你创建一个返回文件的端点时,应使用 FileSchema:
from apiflask.schemas import FileSchema
from flask import send_from_directory
@app.get('/images/<filename>')
@app.output(FileSchema, content_type='image/png')
def get_image(filename):
return send_from_directory(app.config['IMAGE_FOLDER'], filename)
根据 OpenAPI 规范,如果文件格式是二进制的,可以省略模式,因此你也可以使用 EmptySchema:
from apiflask.schemas import EmptySchema
@app.get('/images/<filename>')
@app.output(EmptySchema, content_type='image/png')
或者:
@app.get('/images/<filename>')
@app.output({}, content_type='image/png')
你可以使用 type 和 format 设置自定义文件类型和格式(binary 和 base64 之一,默认为 binary):
@app.output(FileSchema(format='base64'), content_type='image/png')
使用 doc 装饰器¶
你还可以使用 doc 装饰器显式设置操作字段。
Operation 的 summary 和 description¶
以下是使用 doc 装饰器设置 summary 和 description 的示例:
from apiflask import APIFlask
app = APIFlask(__name__)
@app.get('/hello')
@app.doc(summary='打招呼', description='关于 /hello 的一些描述')
def hello():
return 'Hello'
Operation 的 tags¶
当你在应用中使用蓝本时,APIFlask 提供了一个自动标签系统,详见 标签。
如果你没有使用蓝本,或者希望自己控制标签,则需要设置标签。tags 参数接受一个标签名称字符串的列表,这些名称应与 TAGS 配置或 app.tags 属性中传递的值匹配:
@app.get('/')
@app.doc(tags=['Foo'])
def hello():
return 'Hello'
为 operation 设置替代的 responses¶
如上所述,APIFlask 会根据你在视图函数上添加的装饰器(200、422、401、404)添加一些响应。有时你可能希望添加视图函数将返回的替代响应,此时可以使用 @app.doc(responses=...) 参数。它接受以下值:
- 一个状态码的整数列表,例如
[404, 418]。 - 一个格式为
{<STATUS_CODE>: <DESCRIPTION>}的字典,这允许你为每个状态设置自定义描述,例如{404: '未找到', 418: 'Blah...'}。如果已存在相同状态码的响应,则现有描述将被覆盖。
@app.get('/')
@app.doc(responses=[204, 404])
def hello():
return 'Hello'
为响应设置媒体类型(media type)¶
你可以为响应添加额外的媒体类型,这些媒体类型将被添加到 OpenAPI 文档中。这允许你描述在某些情况下可能返回资源的不同表示形式,例如通过执行基于请求某些参数的内容协商。这可以通过提供自定义的 responses 并在每个响应的 content 部分中包含额外的媒体类型来实现,如下所示:
@app.get("/pets/<int:pet_id>")
@app.input(Accept, location="headers")
@app.output(PetOut)
@app.doc(responses={
200: {
'description': '以 JSON 或 HTML 格式返回资源',
'content': {
'text/html': {}
}
}
})
def get_pet(pet_id, headers_data):
pet = pets[pet_id]
if "html" in headers_data.get('accept'):
result = render_template('pets/pet-detail.j2.html', pet=pet)
else:
result = pet
return result
上面的代码片段展示了如何检查请求的 Accept 头,然后返回资源的 HTML 表示或 JSON 表示。
请注意,APIFlask 允许你补充默认的 application/json 媒体类型(对于包含 @app.output 装饰器的视图,APIFlask 会自动添加此媒体类型),并添加额外的媒体类型。
将 operation 标记为 deprecated¶
你可以使用 deprecated 参数将 operation 标记为已弃用:
@app.get('/')
@app.doc(deprecated=True)
def hello():
return 'Hello'
设置 operationId¶
版本 >= 0.10.0
此功能在 版本 0.10.0 中添加。
你可以使用 operation_id 参数为视图函数(对应 operation)设置 operationId:
@app.get('/')
@app.doc(operation_id='myCustomHello')
def hello():
return 'Hello'
APIFlask 支持自动生成 operationId。默认情况下,自动生成行为是禁用的,你可以通过将以下配置变量设置为 True 来启用它:
app.config['AUTO_OPERATION_ID'] = True
自动生成的 operationId 格式为 {HTTP 方法}_{视图的端点}(例如 get_hello)。
Operation spec 扩展¶
版本 >= 2.2.0
此功能在 版本 2.2.0 中添加。
你可以使用 extensions 参数向 operation 对象添加自定义字段:
@app.get('/')
@app.doc(extensions={'x-foo': 'bar'})
def hello():
return 'Hello'
安全信息¶
APIFlask 将根据通过 auth_required 装饰器传递的认证对象生成 security 对象 operation 的 security 字段:
from apiflask import APIFlask, HTTPTokenAuth, auth_required
app = APIFlask(__name__)
auth = HTTPTokenAuth()
@app.get('/')
@app.auth_required(auth)
def hello():
return 'Hello'!
你可以使用 description 参数为认证对象设置描述:
from apiflask import APIFlask, HTTPTokenAuth
app = APIFlask(__name__)
auth = HTTPTokenAuth(description='一些描述')
保护 OpenAPI 端点¶
如果你希望对 OpenAPI 端点应用身份验证或自定义处理逻辑,可以使用以下配置选项:SPEC_DECORATORS、DOCS_DECORATORS 和 SWAGGER_UI_OAUTH_REDIRECT_DECORATORS:
app.config['SPEC_DECORATORS'] = [app.auth_required(auth)]
app.config['DOCS_DECORATORS'] = [app.auth_required(auth)]
查看完整示例:examples/openapi/custom_decorators/app.py
禁用 OpenAPI 支持¶
全局禁用¶
如果你希望为整个应用禁用 OpenAPI 支持,可以在创建 APIFlask 实例时将 enable_openapi 参数设置为 False:
from apiflask import APIFlask
app = APIFlask(__name__, enable_openapi=False)
Tip
如果你只需要禁用 API 文档,请参阅 全局禁用 API 文档。
禁用特定蓝本¶
要从 API 文档(和 OpenAPI 规范)中隐藏蓝本,可以在创建 APIBlueprint 实例时将 enable_openapi 参数设置为 False:
from apiflask import APIBlueprint
bp = APIBlueprint('foo', __name__, enable_openapi=False)
Tip
如果蓝本是由其他 Flask 扩展创建的,APIFlask 将跳过该蓝本。
禁用特定视图函数¶
要从 API 文档(和 OpenAPI 规范)中隐藏视图函数,可以在 doc 装饰器中将 hide 参数设置为 True:
from apiflask import APIFlask, doc
app = APIFlask(__name__)
@app.get('/secret')
@app.doc(hide=True)
def some_secret():
return ''
Warning
默认情况下,即使视图函数没有使用 input、output 和 doc 装饰器,APIFlask 也会将其添加到 API 文档(和 OpenAPI 规范)中。如果你希望禁用此行为,请将配置变量 AUTO_200_RESPONSE 设置为 False:
app.config['AUTO_200_RESPONSE'] = False
注册 spec 处理器¶
你可以使用 app.spec_processor 装饰器注册一个函数来更新 spec。回调函数应接受 spec 作为参数,并在最后返回它。生成 spec 文件时将调用回调函数。
from apiflask import APIFlask
app = APIFlask(__name__)
@app.spec_processor
def update_spec(spec):
spec['info']['title'] = '更新后的标题'
return spec
默认情况下,spec 参数是一个字典。当配置项 SPEC_PROCESSOR_PASS_OBJECT 设置为 True 时,spec 参数将是一个 apispec.APISpec 对象。
from apiflask import APIFlask
app = APIFlask(__name__)
app.config['SPEC_PROCESSOR_PASS_OBJECT'] = True
class FooSchema(Schema):
id = Integer()
@app.spec_processor
def update_spec(spec):
spec.title = '更新后的标题'
spec.components.schema('Foo', schema=FooSchema) # 手动添加一个 schema
return spec