问题描述
我将使用 Flasgger 和 APISpec 从棉花糖模式加载初始定义。除此之外,我还想拥有多个版本的 API 文档。 这是我的代码:
from app.api.v1.controllers.assessment_controller import AssessmentCoachingRequestSchema,AssessmentCoachingResponseSchema
from app.api.v1.responses import AssessmentResultResponseSchema,ModulescoreResponseSchema,RecommendedModulesListResponseSchema,UserModulescoresListResponseSchema
from app.api.v1.requests import AssessmentCreateRequestSchema,AssessmentShowRequestSchema
from app.api.v1.routes import assesment
from flasgger import Swagger
from flask.app import Flask
from flasgger import APISpec,Schema,Swagger,fields
from apispec.ext.marshmallow import MarshmallowPlugin
from apispec_webframeworks.flask import FlaskPlugin
def configure_swagger(app: Flask):
# Create an APISpec
spec = APISpec(
title='API',version='1.0.0',openapi_version='2.0',plugins=[
FlaskPlugin(),MarshmallowPlugin(),],)
template = spec.to_flasgger(
app,deFinitions=[AssessmentCreateRequestSchema,AssessmentResultResponseSchema,AssessmentShowRequestSchema,AssessmentCoachingRequestSchema,AssessmentCoachingResponseSchema,UserModulescoresListResponseSchema,RecommendedModulesListResponseSchema]
)
configs = {
"headers": [
],"specs": [
{
"endpoint": 'v0_spec',"route": '/v0',"version": "0.0.0","title": "API v0","description": 'Version 0 of the API',"rule_filter": lambda rule: rule.endpoint.startswith('api_v0'),"model_filter": lambda tag: True,# all in
},{
"endpoint": 'v1_spec',"route": '/v1',"version": "1.0.0","title": "API v1","description": 'Version 1 of the API',"rule_filter": lambda rule: rule.endpoint.startswith('api_v1'),{
"endpoint": 'test_v1_spec',"route": '/tv1',"title": "API test v1","description": 'Test version 1 of the API',"rule_filter": lambda rule: rule.endpoint.startswith('api_test_v1'),{
"endpoint": 'experiment_v1_spec',"route": '/exp',"title": "API experiment","description": 'Experiment API',"rule_filter": lambda rule: rule.endpoint.startswith('api_exp'),# all in
}
],"static_url_path": "/flasgger_static",# "static_folder": "static",# must be set by user
"swagger_ui": True,"specs_route": "/apidocs/","title": "API","schemes": [
"http","https"
],"securityDeFinitions": {
"basicAuth": {
"type": "http","scheme": "basic"
}
},"security":{"basicAuth": []}
}
swag = Swagger(app,config=configs,template=template)
我还尝试在每个蓝图路线中使用此装饰器以 .yaml 格式加载 API 文档:
@api_v1_blueprint.route('/text-analysis',methods=['GET'])
@swag_from('/app/api/_docs/v1/text_analysis.yaml',methods=["GET"])
@auth.login_required
@validate_request(marshmallow_schema=TextAnalysisRequestSchema)
def text_analysis(request: TextAnalysisRequest):
return show_response(data=analyze_text(request),response_version=RESPONSE_VERSION)
但是当我使用 APISpec 模板时,规范路由不再起作用了! 它不过滤文档,只是将所有文档(v0 和 v1)一起加载! 我的代码有问题还是我的解决方案完全错误?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)