首页 > 解决方案 > 烧瓶没有选择为发布请求提供的参数

问题描述

我创建了一个包含 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}

它仍然告诉我

类型错误:post() 缺少 3 个必需的位置参数:“user_name”、“client_dict”和“order_detail_dict”

谁能指出错误,因为我在发布请求中传递了所有 3 个必需参数,但它仍然告诉我它丢失了。提前致谢

标签: pythonflask

解决方案


对于您在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

推荐阅读