flask не выбирает параметры, предоставленные для пост-запроса - PullRequest
0 голосов
/ 08 апреля 2020

Я создал ресурс, содержащий метод post, который принимает user_name, client_dict, order_detail_dict в качестве аргументов / параметров, как показано ниже

class CreateOrder(Resource):
    def post(self, user_name, client_dict, order_detail_dict):

, и я зарегистрировал ресурс, как показано ниже, с конечной точкой / create_order

api_createorders_addproducts.add_resource(CreateOrder, '/create_order')

Если я сделаю почтовый запрос как

http://127.0.0.1:5000/create_order?user_name={'name':'panda'}&client_dict={'clientname':'panda'}&order_detail_dict={'detail':'details}

, он все равно сообщит мне, что

TypeError: post () отсутствует 3 обязательных позиционных аргумента: ' user_name ',' client_dict 'и' order_detail_dict '

Может кто-нибудь указать на ошибку, потому что я передаю все 3 обязательных параметра в запросе на публикацию, но все же он говорит мне, что он отсутствует. Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Для каждого аргумента, который вы указываете в своем определении post, вы также должны передать значение для него следующим образом:

def post(self, user_name, client_dict, order_detail_dict):
    pass

Вам необходим URL со всеми этими параметрами:

/create_order/<username>/<client_dict>/<order_detail_dict>

Или это не сработает.

Способ обойти это (поскольку вы, возможно, не захотите определять их для каждого URL-адреса), это указать значения по умолчанию, если они отсутствуют, и преобразуйте их в аргументы ключевых слов, например:

def post(self, user_name=None, client_dict=None, order_detail_dict=None):
    pass

Тогда они вам вообще не нужны, и они становятся необязательными частями URL.

Аргументы в вашей функции представления сопоставлены с аргументами в вашем URL

Однако, исходя из вашего вопроса, вы пытаетесь ПОСТАВИТЬ некоторые данные. Эти данные не должны быть в вашей строке URL вообще. Вместо этого попробуйте это:

class CreateOrder(Resource):
    def post(self):
        json_data = request.get_json(force=True)
        print(json_data)

и тогда ваш почтовый запрос будет выглядеть так:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"name":"panda","client_dict": {"clientname": "panda"}, "order_detail_dict": {"detail": "details"}}' \
  http://127.0.0.1:5000/create_order
1 голос
/ 08 апреля 2020

Удалите параметры из функции post, используйте request.get_ json и реструктурируйте свой ввод для почтальона

class CreateOrder(Resource):
    def post(self):
        json_data = request.get_json(force=True)
        user_name = json_data['name']
        client_dict= json_data['client_dict']
        order_detail_dict= json_data['order_detail_dict']
        return jsonify(order_detail_dict)

Измените необработанное тело почтальона на:

{
   "name":"panda",
   "client_dict":{"clientname":"panda"},
   "order_detail_dict":{"details":"detail"}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...