2011-08-16 64 views
7

Tôi đang tạo lại một dịch vụ bằng Python/Flask và đang chạy vào một vấn đề với cách khách hàng hiện có xác thực. Tôi phải khớp với lược đồ khách hàng hiện tại vì lý do tương thích.Buộc loại nội dung hoặc hiển thị request.data trong Flask cho nội dung đã biết

Các khách hàng hiện tại lấy tên người dùng, mật khẩu và mã hóa base64. Đây không phải là Xác thực cơ bản HTTP, mặc dù có vẻ giống nhau. Dưới đây là một số mã mẫu có thể tạo yêu cầu đăng nhập này.

credentials = { 
      'username': '[email protected]', 
      'password': 'password' 
} 
data = b64encode(urlencode(credentials)) 
request = urllib2.Request(loginURL) 
request.add_data(data) 
# request.add_header('Content-Type', 'application/gooblygop') 
# 'application/x-www-form-urlencoded' seems to be a default Content-Type 
login = urllib2.urlopen(request) 

Về phía máy chủ, tôi lấy dữ liệu POST và64 để giải mã lại thông tin về tên người dùng và mật khẩu.

flask server: 
@app.route('/login', methods=['POST']) 
def login(): 
    error = None 
    if request.method == 'POST': 
     # post data: cGFzc3dvcmQ9ZGVmYXVsdCZlbWFpbD10ZXN0JTQwZXhhbXBsZS5jb20= 
     data = b64decode(request.data) 
     # decoded data: password=default&email=test%40example.com 
     return('ok') 

Vấn đề là Loại nội dung. Nếu tôi chỉ định một loại nội dung không xác định trong ứng dụng khách (application/gooblygop), Flask sẽ hiển thị dữ liệu POST cho request.data và tôi có thể giải mã chuỗi base64. Nếu tôi để Content-Type mặc định (application/x-www-form-urlencoded), dữ liệu thô không được tiếp xúc với request.data và tôi không biết cách lấy chuỗi mã hóa base64 và sử dụng nó.

Phần mềm máy khách hiện có tất cả mặc định khá nhiều đối với x-www-form-urlencoded, nhưng tôi không thể dựa vào điều đó luôn xảy ra.

Về cơ bản, tôi cần một phương thức đáng tin cậy, phía máy chủ để truy cập chuỗi được mã hóa đó bất kể Content-Type mà chương trình khách hàng nói là gì.

Ghi chú khác: Tôi rất mới với Python, đến từ nền PHP. Vì vậy, tôi rất cởi mở với các đề xuất. Ngoài ra, dự án này chủ yếu để sử dụng cá nhân.

Trả lời

2

Bạn muốn xem đối tượng request.form khi xử lý các bài đăng được mã hóa theo url với các loại mimetypes bình thường. Trong trường hợp này bạn có một hình thức bất thường, nhưng đây là một cách để làm điều đó:

# mkreq.py 
from urllib import urlencode 
import urllib2 
from base64 import b64encode 

credentials = { 
      'username': '[email protected]', 
      'password': 'password' 
} 
data = b64encode(urlencode(credentials)) 
request = urllib2.Request("http://localhost:5000/login") 
request.add_data(data) 
request.add_header('Content-Type', 'application/gooblygop') 
# 'application/x-www-form-urlencoded' seems to be a default Content-Type 
login1 = urllib2.urlopen(request).read() 
print(login1) 
request2 = urllib2.Request("http://localhost:5000/login") 
request2.add_data(data) 
login2 = urllib2.urlopen(request2).read() 
print(login2) 

Bạn có thể muốn thay đổi các bit đăng nhập để kiểm tra Mimetype, đây là một phiên bản với những thay đổi tối thiểu để thiết lập hiện tại của bạn:

@app.route('/login', methods=['POST']) 
def login(): 
    error = None 
    if request.method == 'POST': 
     # post data: cGFzc3dvcmQ9ZGVmYXVsdCZlbWFpbD10ZXN0JTQwZXhhbXBsZS5jb20= 
     data = b64decode(request.data) 
     # decoded data: password=default&email=test%40example.com 
     if not data: 
      data = b64decode(request.form.keys()[0]) 
     special_mimetype = request.mimetype 
     return(special_mimetype + '\n' + data) 

Đây là sản phẩm của các mẫu mã đầu tiên, với hai yêu cầu:

bvm$ python mkreq.py 
application/gooblygop 
username=test%40example.com&password=password 
application/x-www-form-urlencoded 
username=test%40example.com&password=password 
1

bạn đã bao giờ nghĩ về việc sử dụng json để truyền dữ liệu của bạn trong POST? Flask đã xây dựng để hỗ trợ cho việc truyền dữ liệu json. Ngoài ra, nếu bạn thiết lập Content-Type trong tiêu đề để application/json sau đó bình sẽ tự động dejson dữ liệu POST cho bạn và đặt nó trong request.json

Đây là ứng dụng yêu cầu

import urllib2 
import json 

if __name__ == "__main__": 
    headers = {'Content-Type':'application/json'} 
    post_data = {"user":"test_user"} 
    print "Posting request" 
    req = urllib2.Request("http://localhost:5000/login", json.dumps(post_data), headers) 
    resp = urllib2.urlopen(req) 
    print "Response was %s" % resp.read() 

Đây là chế độ xem Flask

from flask import request 

@app.route('/login', methods=['POST']) 
def login(): 

    user = request.json['user'] 
    return user 

Tôi đề nghị bạn thử sử dụng curl nếu bạn đang sử dụng thiết bị đầu cuối Linux. Dưới đây là ví dụ

curl -X POST -H "Content-Type:application/json" -s -d '{"user":"This is the username"}' 'localhost:5000/login' 

This is the username 
Các vấn đề liên quan