web-dev-qa-db-ja.com

Flaskフォーム経由でデータを投稿すると、400の不正なリクエストが出ます

フロントエンドを介してデータを投稿しようとしていますが、flaskアプリが400の不正なリクエストをスローしています。ただし、Curl呼び出しを使用して同じことを行っている場合、問題なく動作するようです。フォームに欠落しています。

以下は私のフォームコードです

<script>
function sub() {
    console.log('sub function');
    $("#fquery").submit();
}
</script>
<form id="form1" action="/final" method="post">
 <input id='query' type="text">
  <button type="submit" onClick='sub()'>Submit &raquo;</button>
</form>

サーバー側:

@app.route('/final',methods=['POST','GET'])
def message():
    if request.method == 'POST':
        app.logger.debug(" entered message function"+ request.form['query'])
        q = request.form['query']
    return render_template('final.html',query=q,result="Core_Table Output")

サーバー側は私には問題ないようです。カールリクエストに対応しているので

curl http://localhost:8000/final -d "query=select starct st blah blah" -X POST -v
*   Trying 127.0.0.1... connected
> POST /gc HTTP/1.1
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:8000
> Accept: */*
> Content-Length: 41
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 41out of 41 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 1961
< Server: Werkzeug/0.9.4 Python/2.7.3
< Date: Thu, 24 Oct 2013 23:33:12 GMT
12
Rahul

ああ、そうだと思います:id要素にはnameを設定するだけで、inputは設定しません。ただし、nameはサーバーに送信されるフォームデータで使用されます。これにより、request.form['query']KeyErrorが発生し、400エラーが発生します。

25
Robin Krahl

@Robin Krahlの発言に加えて、フォームにenctype="multipart/form-data"も追加する必要があります。したがって、コードは次のようになるでしょう:

<form id="form1" action="/final" method="post" enctype="multipart/form-data">
   <input id='query' type="text">
   <button type="submit" onClick='sub()'>Submit &raquo;</button>
</form>"
2
Jerry