首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Flasgger中注册Swagger端点

如何在Flasgger中注册Swagger端点
EN

Stack Overflow用户
提问于 2019-09-13 19:39:58
回答 1查看 2.2K关注 0票数 0

目前使用Swagger/Flasgger/烧瓶记录应用程序中的app /路由。

代码语言:javascript
复制
# app.py
from flask import Flask
from flasgger import Swagger
from myapp.blueprints.main import main

app = Flask(__name__)    
app.register_blueprint(main)
swag = Swagger(app)
代码语言:javascript
复制
# myapp.blueprints.main.views.py
main = Blueprint('main', __name__)    

@main.route('/user/<path:user_id>', methods=['GET', 'PUT', 'DELETE'])
@main.route('/user', methods=['GET', 'POST'])
def user(user_id=None):
    pass

要获得用于同一函数的两条路由的文档,我需要为每个Flasgger文档做两件事

  1. 添加指向包含规范的文件的@swag_from声明。
  2. @main.route@swag_from同样的endpoint kwarg。

当我执行步骤1时,我开始在Swagger输出中看到规范信息:

代码语言:javascript
复制
# myapp.blueprints.main.views.py
@main.route('/user/<path:user_id>', methods=['GET', 'PUT', 'DELETE'])
@main.route('/user', methods=['GET', 'POST'])
@swag_from('user_without_id.yml')
def user(user_id=None):
    pass
代码语言:javascript
复制
// > curl localhost:8000/apispec_1.json
{
"definitions": {
    "User": {
      "properties": {
        "age": {
          "default": "180", 
          "description": "The user age (should be integer)", 
          "type": "integer"
        }, 
        "tags": {
          "default": [
            "wizard", 
            "hogwarts", 
            "dead"
          ], 
          "description": "optional list of tags", 
          "items": {
            "type": "string"
          }, 
          "type": "array"
        }, 
        "username": {
          "default": "Sirius Black", 
          "description": "The user name.", 
          "type": "string"
        }
      }, 
      "required": [
        "username", 
        "age"
      ]
    }
  }, 
  "info": {
    "description": "The test-swagger-api spec", 
    "termsOfService": "/tos", 
    "title": "test-swagger-api", 
    "version": "1.0"
  }, 
  "paths": {
    "/user": {
      "get": {
        "description": "The default payload is invalid, try it, then change the age to a valid integer and try again<br/>", 
        "parameters": [
          {
            "in": "body", 
            "name": "body", 
            "required": true, 
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        ], 
        "responses": {
          "200": {
            "description": "A single user item", 
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        }, 
        "summary": "Test validation using JsonSchema"
      }, 
      "post": {
        "description": "The default payload is invalid, try it, then change the age to a valid integer and try again<br/>", 
        "parameters": [
          {
            "in": "body", 
            "name": "body", 
            "required": true, 
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        ], 
        "responses": {
          "200": {
            "description": "A single user item", 
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        }, 
        "summary": "Test validation using JsonSchema"
      }
    }, 
    "/user/{user_id}": {
      "get": {
        "description": "The default payload is invalid, try it, then change the age to a valid integer and try again<br/>", 
        "parameters": [
          {
            "in": "body", 
            "name": "body", 
            "required": true, 
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        ], 
        "responses": {
          "200": {
            "description": "A single user item", 
            "schema": {
              "$ref": "#/definitions/User"
            }
          }
        }, 
        "summary": "Test validation using JsonSchema"
      }
    }
  }, 
  "swagger": "2.0"
}

但是,一旦我添加了endpointmethods kwargs,我的输出就失去了规范:

代码语言:javascript
复制
# myapp.blueprints.main.views.py
@main.route('/user/<path:user_id>', methods=['GET', 'PUT', 'DELETE'])
@main.route('/user', endpoint='my-new-endpoint', methods=['GET', 'POST'])
@swag_from('user_without_id.yml', endpoint='my-new-endpoint', methods=['GET', 'POST'])
def user(user_id=None):
    pass
代码语言:javascript
复制
// > curl localhost:8000/apispec_1.json
{
  "definitions": {}, 
  "info": {
    "description": "The test-swagger-api spec", 
    "termsOfService": "/tos", 
    "title": "test-swagger-api", 
    "version": "1.0"
  }, 
  "paths": {}, 
  "swagger": "2.0"
}

不确定文档的去向。Flasgger的蓝图示例并没有展示如何使用一个函数上的多个路由来实现这个功能。

EN

回答 1

Stack Overflow用户

发布于 2019-09-13 23:14:33

https://stackoverflow.com/a/55109061/3316036

@swag_from需要在其endpoint字段中包含蓝图名称,遗憾的是,flasgger文档中并不清楚这一点。

代码语言:javascript
复制
# myapp.blueprints.main.views.py
@main.route('/user/<path:user_id>', methods=['GET', 'PUT', 'DELETE'])
@main.route('/user', endpoint='my-new-endpoint', methods=['GET', 'POST'])
@swag_from('user_without_id.yml', endpoint='main.my-new-endpoint', methods=['GET', 'POST'])
def user(user_id=None):
    pass
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57929491

复制
相关文章

相似问题

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