【问题标题】:The flask api route request get params missing error烧瓶 api 路由请求获取参数丢失错误
【发布时间】:2021-06-02 16:33:08
【问题描述】:

在我的烧瓶项目中,我有一条路线:

@app.route('/api/d/u', methods=['POST'])
def update(name, domain_list, pem_key, pem_cert, origin_ips):  # name, domain_list, pem_key, pem_cert, origin_ips
    return "update"

if __name__ == '__main__':
    app.run(debug=True)

但在我的邮递员中我想测试 api,

当我发送请求但得到 TypeError 时:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>TypeError: update() missing 5 required positional arguments: 'name', 'domain_list', 'pem_key', 'pem_cert', and 'origin_ips' // Werkzeug Debugger</title>
        <link rel="stylesheet" href="?__debugger__=yes&amp;cmd=resource&amp;f=style.css"
        type="text/css">
        <!-- We need to make sure this has a favicon so that the debugger does
         not by accident trigger a request to /favicon.ico which might
         change the application state. -->
     ......
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
TypeError: update() missing 5 required positional arguments: 'name', 'domain_list', 'pem_key', 'pem_cert', and 'origin_ips'

-->

【问题讨论】:

    标签: python flask postman


    【解决方案1】:

    你的路由函数的参数只填充了一个 GET 请求。示例:

    @app.route('/api/d/u/<name>', methods=['GET'])
    def update(name):
        return "update"
    
    #Example Call would be GET http://127.0.0.1:5000/api/d/u/myname
    

    对于您的 POST 示例,您可能需要从烧瓶中导入 request,并且由于您正在检索表单数据,因此您可以像这样提取它:

    from flask import Flask, request
    
    app = Flask(__name__)
    
    @app.route('/api/d/u', methods=['POST'])
    def update():
        formdata = request.form
        # Extract form-data: name = formdata['name']
        return "update"
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    【讨论】:

    • update(name, domain_list, pem_key, pem_cert, origin_ips)中的params有什么用?
    • 这些参数只有在发送者在路由/路径/url中提到它们时才会被填充,如上所示:'/api/d/u///...'。但是由于你是发送一个 POST 并且你是在 Body 中传输信息,所以你需要使用 request.fom
    • 所以,只有GET 方法可以使用它们,对吧?
    • POST 请求也会填充这些参数,如果它们在 URL 中被提及。 - 或者显然,如果你在代码中的其他地方调用你的更新函数。例如update('myname', ['domain1', 'domain2'],...)
    【解决方案2】:

    因为你用参数定义了你的函数,flask 期望从路由中获取它们。如果你想使用你当前的实现,你应该这样做

    from flask import app, request
    
    @app.route('/api/d/u', methods=['POST'])
    def update():  # name, domain_list, pem_key, pem_cert, origin_ips
        # data = request.get_json() # use if you send data as json
        data = request.form # use if you send data as a form
        name = data["name"]
        domain_list = data["domain_list"]
        # ... continue with other fields
        return "update"
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    【讨论】:

    • 我编辑了答案以考虑到数据是以表单而不是 json 形式发送的事实
    猜你喜欢
    • 2019-12-29
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多