2013-04-06 54 views
9

login endpoint của tôi trông giống nhưcách truy cập dữ liệu biểu mẫu bằng bình?

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

Khi tôi thử nghiệm này sử dụng curl, cuộc gọi GET trông giống như

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

nhưng trên POST, tôi không thể truy cập vào dữ liệu mẫu và nhận được 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> 

Trên máy chủ, mặc dù thông tin gỡ lỗi in sau

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

nơi tôi làm print request.form. Tôi không thể hiểu được nơi tôi đang làm sai

Trả lời

7

Bạn không sử dụng chính xác curl. Hãy thử như thế này:

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

Các lỗi 400 Bad Request là hành vi bình thường khi bạn cố gắng để có được chìa khóa không tồn tại từ request.form.

Ngoài ra, sử dụng request.json thay vì request.form và gọi curl như thế này:

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

Bạn vẫn cần phải trả lại một phản ứng:

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 

Đây là tài liệu cho custom Flask error pages.

Ngoài ra, hãy xem Flask-Bcrypt để băm mật khẩu.


Dòng lệnh CURL của bạn không hợp lệ. Đối tượng JSON cần phải có dấu ngoặc kép xung quanh khóa và giá trị:

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

Bây giờ, bạn có thể truy cập khóa bằng request.json.

+0

Cảm ơn @Blender, nhưng câu hỏi là tại sao tôi không thể truy cập 'uuid' khi tôi gửi cho khách hàng dưới hình thức dữ liệu? – daydreamer

+1

@daydreamer: Flask gửi phản hồi đó chỉ khi bạn truy cập một khóa không tồn tại trong đối tượng ['request.form'] (http://flask.pocoo.org/docs/quickstart/#the-request-object). Thử sử dụng 'request.form.get ('uuid', None)'. – Blender

+0

Như đã đề cập trong câu hỏi của tôi, 'request.form' của tôi là' ImmutableMultiDict ([("{'uuid': 'admin', 'mật khẩu': 'admin'}", u '')]) ' – daydreamer

Các vấn đề liên quan