Можно ли определить вложенную схему с взаимоисключающими полями в зефире? - PullRequest
3 голосов
/ 14 марта 2019

Я использую зефир для проверки данных JSON, которые я получаю в колбе restful api. Однако в запросе post есть взаимоисключающее поле .
Например : {"predict": {"id": "5hgy667y4h7f"}} или {"predict": {"text": "This is a sample sentence"}}
Но НЕ и id, и text должны быть отправлены вместе. Кроме того, различные методы вызываются в зависимости от погоды id или text получено.

В) Как мне построить схему в зефире, которая позволяет мне проверить выше?

Пример кода, который я имею для одного из полей ниже -

from flask import Flask, request
from flask_restful import Resource, Api, abort
from marshmallow import Schema, fields, ValidationError
app = Flask(__name__)
api = Api(app)

class Mutex1(Schema):
    text = fields.Str(required=True)
    class Meta:
        strict = True

class Mutex2(Schema):
    id_ = fields.Str(required=True)
    class Meta:
        strict = True

class MySchema(Schema):
    predict = fields.Nested(Mutex1)
    class Meta:
        strict = True

class Test(Resource):
    def post(self):
        input_req = request.get_json(force=True)
        try:
            result = MySchema().load(input_req)
        except ValidationError:
            return {'message': 'Validation Error'}, 500
        else:
            return {'message': 'Successful validation'}, 200

api.add_resource(Test, '/test')
app.run(host='0.0.0.0', port=5000, debug=True)

Этот код принимает только text и text с id_, однако он отклоняет только id_. Любая идея, как заставить его принять id_ и отклонить оба text и id_ при передаче вместе?

1 Ответ

0 голосов
/ 15 марта 2019

Создайте схему Mutex с обоими значениями text и id_ и добавьте проверку на уровне схемы для сбоя, если оба предоставлены.

class Mutex(Schema):

    @validates_schema
    def validate_numbers(self, data):
        if (
               ('text' in data and 'id_' in data) or
               ('text' not in data and 'id_' not in data)
           ):
            raise ValidationError('Only one of text and _id is allowed')

    text = fields.Str()
    id_ = fields.Str()
    class Meta:
        strict = True

Примечания:

  • Ошибка проверки ввода не должна возвращать 500 (ошибка сервера), а 422.
  • Я не знаком с флеш-отдыхом, но похоже, что вы могли бы немного сэкономитьшаблон с помощью webargs для анализа входных данных ресурса.
...