Python 我';从表单检索POST数据时,是否出现BadRequestKeyError?

Python 我';从表单检索POST数据时,是否出现BadRequestKeyError?,python,html,flask,Python,Html,Flask,您好,这是一个flask应用程序,我无法使用此代码和模板插入数据库 我收到的错误是 2020-08-11 02:15:17,851: werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand. 烧瓶_app.py: @app.route('/submission', methods=['G

您好,这是一个flask应用程序,我无法使用此代码和模板插入数据库

我收到的错误是

2020-08-11 02:15:17,851: werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
烧瓶_app.py:

@app.route('/submission', methods=['GET', 'POST'])
def do_submission() -> 'html':

    @copy_current_request_context
    def log_request(req: 'flask_request', res: str) -> None:
        sleep(1)
        with UseDatabase(app.config['dbconfig']) as cursor:
            _SQL = """insert into client
                    (email, phonenumber)
                    values
                    (%s, %s)"""
            cursor.execute(_SQL, (req.form['useremail'],
                                 req.form['phone'],))

    results = ""
    try:
        t = Thread(target=log_request, args=(request, results))
        t.start()
    except Exception as err:
        print('***** Logging failed with this error:', str(err))
    return render_template('index.html',)
index.html:

  <form method='POST' action='/submission'>
  <table>
  <p>Use this form to submit a search request:</p>
  <tr><td>Email:</td><td><input name='useremail' type='EMAIL' width='60'></td></tr>
  <tr><td>Phone number:</td><td><input name='phone' type='TEXT' value='12505555555'></td></tr>
  </table>
  <p>When you're ready, click this button:</p>
  <p><input value='Do it!' type='SUBMIT'></p>
  </form>

错误是什么意思?

请参阅,这里有一个单词
BadRequestKeyError
,表示您试图使用一个不存在的键来访问数据

为什么会出现此错误?

当您在输入字段中提供的名称与您试图从请求对象获取值时使用的名称不匹配时,通常会发生此错误。在您的情况下,当您启动服务器并调用
log\u request
方法时,您试图从空请求对象访问
useremail
phone
,因为还没有发生
POST
请求。由于请求对象为空,因此这些键不存在

如何解决此错误?

因此,我们需要检查请求对象是否为空。现在,request对象可能是空的,但请确保只有当存在
POST
请求时才会调用
log\u request
方法。您需要处理不同的边缘情况,但我假设如果请求对象作为
POST
request发出,它将不会为空

@app.route('/submission',methods=['GET',POST'])
def do_submission()->“html”:
如果request.method==“POST”:
@复制\u当前\u请求\u上下文
def日志请求(请求:“烧瓶请求”,res:str)->无:
睡眠(1)
使用UseDatabase(app.config['dbconfig'])作为光标:
_SQL=“”插入到客户端
(电子邮件、电话号码)
价值观
(%s,%s)”
cursor.execute(_SQL,(请求表单['useremail']),
申请表格[“电话]))
#其余的逻辑
结果=“”
尝试:
t=线程(目标=日志\请求,参数=(请求,结果))
t、 开始()
除异常作为错误外:
打印('****日志记录失败,出现此错误:',str(err))
其他:
返回渲染模板('index.html')
建议

但是,我强烈建议您不要将
线程
用于这样一个简单的应用程序。对于一项简单的任务来说,这太过分了。

@BlackList96

在阅读了你的答案和建议后,我测试了以下内容,并且成功了!谢谢你帮助我:

@app.route('/submission', methods=['POST'])
def do_submission() -> 'html':

    if request.method == 'POST':

        @copy_current_request_context
        def log_request(req: 'flask_request', res: str) -> None:
            sleep(15)
            with UseDatabase(app.config['dbconfig']) as cursor:
                _SQL = """insert into client
                        (email, phonenumber)
                        values
                        (%s, %s)"""
                cursor.execute(_SQL, (req.form['useremail'],
                                    req.form['phone'],))
        results = ""
        log_request(request,results)
    return render_template('index.html')

通过在线程中运行查询,您试图实现什么?(你缺少了一个
t.join()
,假设需要这个线程)。我用你的解决方案和建议发布了一个答案。现在它更有意义了。
@app.route('/submission', methods=['POST'])
def do_submission() -> 'html':

    if request.method == 'POST':

        @copy_current_request_context
        def log_request(req: 'flask_request', res: str) -> None:
            sleep(15)
            with UseDatabase(app.config['dbconfig']) as cursor:
                _SQL = """insert into client
                        (email, phonenumber)
                        values
                        (%s, %s)"""
                cursor.execute(_SQL, (req.form['useremail'],
                                    req.form['phone'],))
        results = ""
        log_request(request,results)
    return render_template('index.html')