web-dev-qa-db-ja.com

フラスコを使用してフォームデータにアクセスする方法

私のloginエンドポイントは次のようになります

@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        print request.form # debug line, see data printed below
        user = User.get(request.form['uuid'])
        if user and hash_password(request.form['password']) == user._password:
            login_user(user, remember=True)  # change remember as preference
            return redirect('/home/')
    else:
        return 'GET on login not supported'

curlを使用してこれをテストすると、GET呼び出しは次のようになります

⮀ ~PYTHONPATH ⮀ ⭠ 43± ⮀ curl http://127.0.0.1:5000/login/
GET on login not supported

POSTでは、フォームデータにアクセスしてHTTP 400を取得できません

⮀ ~PYTHONPATH ⮀ ⭠ 43± ⮀ curl -d "{'uuid': 'admin', 'password': 'admin'}" http://127.0.0.1:5000/login/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>

しかしサーバーでは、私のデバッグ情報は次を出力します

ImmutableMultiDict([("{'uuid': 'admin', 'password': 'admin'}", u'')])

ここで私はprint request.formを行います。どこが間違っているのか理解できません

11
daydreamer

curlを正しく使用していません。このようにしてみてください:

curl -d 'uuid=admin&password=admin'

400 Bad Requestエラーは、request.formから存在しないキーを取得しようとした場合の通常の動作です。

または、request.jsonの代わりにrequest.formを使用して、次のようにcurlを呼び出します。

curl -d '{"uuid":"admin","password":"admin"}' -H "Content-Type: application/json" 
8
janos

あなたはまだ応答を返す必要があります:

from flask import abort

@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = User.get(request.form['uuid'])

        if user and hash_password(request.form['password']) == user._password:
            login_user(user, remember=True)
            return redirect('/home/')
        else:
            return abort(401)  # 401 Unauthorized
    else:
        return abort(405)  # 405 Method Not Allowed

custom Flask error pages のドキュメントは次のとおりです。

また、パスワードハッシュについては Flask-Bcrypt を参照してください。


CURLコマンドラインが無効です。 JSONオブジェクトでは、キーと値を二重引用符で囲む必要があります。

$ curl -d '{"uuid": "admin", "password": "admin"}' http://127.0.0.1:5000/login/

これで、request.jsonを使用してキーにアクセスできます。

6
Blender