首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将apispec和烧瓶- Swagger组合成一个Swagger页面?

如何将apispec和烧瓶- Swagger组合成一个Swagger页面?
EN

Stack Overflow用户
提问于 2022-05-24 21:14:30
回答 1查看 685关注 0票数 0

我在互联网上找不到任何关于如何实际提取和利用由OpenAPI包生成的apispec规范来生成Swagger页面的信息。

我不想依赖一个没有像flask-apispec那样被积极维护的包。我只想使用flask-swagger-uiapispec和其他标准/维护良好的软件包。

这是我的测试应用。我不知道APISpec是否工作正常,因为文档没有告诉您如何处理对象,但是Flask应用程序是功能良好的。

代码语言:javascript
复制
from flask import Flask, request, abort
from marshmallow import Schema, fields
from apispec import APISpec
from apispec.ext.marshmallow import MarshmallowPlugin
from apispec_webframeworks.flask import FlaskPlugin


app = Flask(__name__)


spec = APISpec(
    title="Doubler",
    version="1.0.0",
    openapi_version="3.0.2",
    plugins=[FlaskPlugin(), MarshmallowPlugin()],
              )


class InputSchema(Schema):
    useless_1 = fields.String(required=True, description='A string')
    useless_2 = fields.Int(missing=5, description='An integer')


class OutputSchema(Schema):
    doublyuseless_1 = fields.String(required=True)
    doublyuseless_2 = fields.Int(required=True)


inputschema = InputSchema()
outputschema = OutputSchema()


@app.route('/double', methods=['GET'])
def double():
    """A doubler.
    ---
    get:
      description: Double things
      parameters:
        schema:
          InputSchema
      responses:
        200:
          description: Double things
          content:
            application/json:
              schema: OutputSchema"""
    errors = inputschema.validate(request.args)
    if errors:
        abort(400, str(errors))
    return_dict = {}
    args = inputschema.load(request.args)
    return_dict['doublyuseless_1'] = args['useless_1']*2
    return_dict['doublyuseless_2'] = args['useless_2']*2
    return outputschema.dump(return_dict)


with app.test_request_context():
    spec.path(view=double)

更新:使用下面的代码,我现在在根上得到一个空白页,标题为Swagger,但没有内容。

代码语言:javascript
复制
with app.test_request_context():
    spec.path(view=double)
    with open('swagger.json', 'w') as f:
        dict_ = yaml.load(StringIO(spec.to_yaml()), Loader=yaml.SafeLoader)
        print(dict_)
        with open('swagger.json', 'w') as f:
            json.dump(dict_, f)
    SWAGGER_URL = '/'
    API_URL = 'swagger.json'


swaggerui_blueprint = get_swaggerui_blueprint(
    SWAGGER_URL,  # Swagger UI static files will be mapped to '{SWAGGER_URL}/dist/'
    API_URL,
    config={  # Swagger UI config overrides
        'app_name': "Doubler"
    },
    # oauth_config={  # OAuth config. See https://github.com/swagger-api/swagger-ui#oauth2-configuration .
    #    'clientId': "your-client-id",
    #    'clientSecret': "your-client-secret-if-required",
    #    'realm': "your-realms",
    #    'appName': "your-app-name",
    #    'scopeSeparator': " ",
    #    'additionalQueryStringParams': {'test': "hello"}
    # }
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-27 13:06:52

我最初问题的解决方案非常简单:ApiSpec有一个to_dict和一个to_yaml方法来导出swagger.json。我的第二个问题是更深奥的。我需要使用一个不是SWAGGER_URL/,因为出于某种原因,这导致页面在http://swagger-ui.js这样的URL上查找核心Swagger文件,这显然不起作用。当我更改到/doc的路径后,我仍然有一个白色的屏幕,但是可以通过自己在/doc托管文件来解决这个问题(我认为flask_swagger_ui应该自动完成这一操作,但是嘿,它成功了)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72369545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档