flask + схема зефира жалуется на «пропущенные данные для обязательного поля» - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть простой flask сервер (на этом этапе без sqlalchemy), и он не может проанализировать запрос на обязательное поле

Сервер python код ->

from flask import request, jasonify, make_response, abort
from marshmallow import Schema, fields

class MySchema(Schema):
      ref_date=fields.Str(required=True)

schema_instance = MySchema()
@app.route('/functions/regression',method=['GET'])
def perform_regression():
     print('ref_date: ', request.args.get('ref_date'))
     errors = schema_instance.validate(request.form)
     if errors:
         abort(400, str(errors))

app.run()

У меня есть клиентский python код следующим образом ->

import requests
res = requests.get("http://127.0.0.1:5000/functions/regression?ref_date='20200205'")
print(res.status_code, res.text)

Я всегда получаю сообщение об ошибке «Отсутствуют данные для обязательного поля».

Есть указатели? Я правильно получаю параметры на сервере, что можно увидеть с помощью request.args.get (), но после этой схемы возвращается ошибка

С уважением

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

По предложению Игоря следующие работы

from flask import request, jasonify, make_response, abort
from marshmallow import Schema, fields

class MySchema(Schema):
    ref_date=fields.Str(required=True)

schema_instance = MySchema()
@app.route('/functions/regression',method=['GET'])
def perform_regression():
    print('ref_date: ', request.args.get('ref_date'))
    errors = schema_instance.validate(request.args) #<--fix here
    if errors:
        abort(400, str(errors))

app.run()
0 голосов
/ 22 апреля 2020

Serializer ожидает, что ваши данные будут в полезной нагрузке запроса, а не в параметрах запроса.

Итак, у вас есть два варианта:

  1. Вместо GET используйте запрос PUT или POST и поместите данные в полезную нагрузку (как {"ref_date": "20200205"})
  2. В вашем метод, поместите параметры запроса в некоторый словарь и используйте его вместо request.form.

По сути, проблема в том, что request.form не имеет данных, поэтому сериализатор выдает ошибку об отсутствии обязательного поля.

...