2013-04-06 5 views
9

Моя 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. Я не могу понять, где я делаю неправильно

ответ

7

Вы не используете 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" 
6

Вы все еще должны вернуть ответ:

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.

+0

Спасибо @Blender, но вопрос в том, почему я не могу получить доступ к 'uuid', когда я отправляю форму данных клиента? – daydreamer

+1

@daydreamer: Flask отправляет этот ответ только в том случае, если вы получаете доступ к ключу, который не существует в объекте ['request.form'] (http://flask.pocoo.org/docs/quickstart/#the-request-object). Попробуйте использовать 'request.form.get ('uuid', None)'. – Blender

+0

Как уже упоминалось в моем вопросе, мой 'request.form' является' ImmutableMultiDict ([{"uuid ':' admin ',' password ':' admin '}", u' ')]) ' – daydreamer