2013-04-06 9 views
9

mio login endpoint sembracome accedere ai dati del modulo usando il pallone?

@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' 

quando prova questo utilizzando curl, la chiamata GET assomiglia

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

ma POST, io non sono in grado di accedere ai dati del modulo e ottenere 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> 

Sul server però, il mio informazioni di debug stampa il seguente

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

dove faccio print request.form. Io non sono in grado di capire dove sto facendo male

risposta

7

Non si sta utilizzando curl correttamente. Prova in questo modo:

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

L'errore 400 Bad Request è il solito comportamento quando si tenta di ottenere le chiavi inesistenti da request.form.

In alternativa, utilizzare request.json invece di request.form e chiamare curl come questo:

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

Hai ancora bisogno di restituire una risposta:

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 

Ecco la documentazione per custom Flask error pages.

Inoltre, dare un'occhiata a Flask-Bcrypt per l'hashing della password.


La riga di comando CURL non è valida. oggetti JSON bisogno di avere doppi apici le chiavi ei valori:

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

Ora, è possibile accedere alle chiavi con request.json.

+0

Grazie @Blender, ma la domanda è: perché io non sono in grado di accedere 'uuid' quando io mando il cliente sotto forma di dati? – daydreamer

+1

@daydreamer: Flask invia tale risposta solo se si accede a una chiave che non esiste nell'oggetto ['request.form'] (http://flask.pocoo.org/docs/quickstart/#the-request-object). Prova a usare 'request.form.get ('uuid', None)'. – Blender

+0

Come accennato nella mia domanda, il mio 'request.form' è' ImmutableMultiDict ([("{'uuid': 'admin', 'password': 'admin'}", u '')]) ' – daydreamer