2013-04-06 52 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 2013-04-06 21:10:09

+1

@daydreamer:只有当您访问['request.form'对象]中不存在的键时,Flask才会发送该响应(http://flask.pocoo.org/docs/quickstart/#the-request-object )。尝试使用'request.form.get('uuid',None)'。 – Blender 2013-04-06 21:17:29

+0

正如我的问题所述,我的'request.form'是'ImmutableMultiDict([(“{'uuid':'admin','password':'admin'}”,'')))' – daydreamer 2013-04-06 21:18:56