TLDR;Чего я добиваюсь:
Поскольку есть возможность загрузить универсальную / прикладную схему в flasgger
, как это определено параметром template_file
при создании экземпляра Swagger
, как я могу автоматическипроверять все данные, отправляемые конечным точкам, с которыми связаны flask-restful
Resource
классы, при использовании универсального файла схемы json?
В настоящее время я разрабатываю API и столкнулся с ситуацией, когда при определениивсю мою схему из файла шаблона json и использую классы ресурсов с возможностью восстановления фляг, данные, предоставленные в вызовах API, не проверены.
Проводка на /product
с допустимой полезной нагрузкой приводит к ожидаемому ответу 501. Но публикация с недопустимой полезной нагрузкой также приводит к ответу 501.
Ожидаемая полезная нагрузка:
{
"id": 0,
"name": "Toy",
"photoUrls": [
"string"
],
"status": "available"
}
Полезная нагрузка, которая должна не пройти проверку:
{
"id": 0,
"name": "test",
"status": "available"
}
Ниже приведенофрагмент класса Resource
и как я настроил flasgger
настроенный
# https://github.com/flasgger/flasgger
# pip install flask flasgger flask-restful
from flasgger import Swagger, LazyString, LazyJSONEncoder
from flask import Flask, jsonify, request, url_for
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
app.json_encoder = LazyJSONEncoder
app.config['SWAGGER'] = {
'title': 'TestAPI',
'uiversion': 3,
'favicon': LazyString(lambda: url_for('static', filename='logo.png')),
'swagger_ui_css': LazyString(lambda: url_for('static', filename='swagger-ui.css')),
'specs_route': '/docs/'
}
swagger = Swagger(app, template_file='static/Swagger.json')
class NewProduct(Resource):
def post(self):
return '', 501
api.add_resource(NewProduct, '/product')
if __name__ == "__main__":
app.run(debug=True)
А ниже приведено содержимое Swagger.json
файла
{
"swagger": "2.0",
"info": {
"description": "",
"version": "1.0.0",
"title": "POC for Non-validation Issue",
"termsOfService": "http://swagger.io/terms/",
"contact": {
"email": "testing@abc.com"
},
"license": {
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
}
},
"host": "",
"basePath": "/",
"tags": [
{
"name": "Product",
"description": "Operations to manage product info",
"externalDocs": {
"description": "Find out more",
"url": "http://swagger.io"
}
}
],
"schemes": [
"http"
],
"paths": {
"/product": {
"post": {
"tags": [
"Product"
],
"summary": "Add a new product",
"description": "",
"operationId": "addProduct",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"in": "body",
"name": "body",
"description": "",
"required": true,
"schema": {
"$ref": "#/definitions/Product"
}
}
],
"responses": {
"200": {
"description": "Product created"
},
"405": {
"description": "Invalid input"
},
"501": {
"description": "Not Yet Implemented"
}
}
}
}
},
"definitions": {
"Product": {
"type": "object",
"required": [
"name",
"photoUrls"
],
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"name": {
"type": "string",
"example": "Toy"
},
"photoUrls": {
"type": "array",
"xml": {
"name": "photoUrl",
"wrapped": true
},
"items": {
"type": "string"
}
},
"status": {
"type": "string",
"description": "State of availability",
"enum": [
"available",
"pending",
"sold"
]
}
},
"xml": {
"name": "Toy"
}
}
}
}
Я изначально использовал отдельные функциии @swag_from('myfile.yml', validation=True)
декоратор для каждой функции, но ради наилучшей практики ООП я хотел использовать классы для представления соответствующих конечных точек.
Я рассчитывал, так как я загрузил json template_file
, когда я установил Swagger
, что конечные точки будут проверены на соответствие определениям в этом файле, но, похоже, это не так по какой-то причине (или ячто-то не так).
Может кто-нибудь подсказать, как я могу проверить все конечные точки моих классов на соответствие определениям template_file
? Можно ли это сделать с текущим состоянием проекта Flasgger
или эта функциональность отсутствует?
Примечания:
1. Я создал проблему на репозитории gitub Flasgger , о котором я подробно писал после этого поста. Но, поскольку репо в настоящее время довольно необитаемо, я чувствовал, что было бы более вероятно, что я получил бы ответ здесь.
2. Я не ищу использовать схему Marshmallow, я хочуиметь возможность загружать мою схему swagger из файла json при первом создании Flasgger
и применять его (проверять все применимые маршруты на основе Definitions
в файле json) в целом для всех маршрутов.