2011-08-16 15 views
7

के लिए फ्लास्क में फोर्स सामग्री को टाइप करें या टाइप करें। मैं पाइथन/फ्लास्क में एक सेवा पुनर्निर्माण कर रहा हूं और मौजूदा क्लाइंट प्रमाणीकृत तरीके से एक समस्या में भाग रहा हूं। मुझे संगतता कारणों के लिए मौजूदा ग्राहकों की योजना से मेल खाना पड़ेगा।ज्ञात सामग्री-प्रकार

मौजूदा क्लाइंट उपयोगकर्ता नाम, पासवर्ड और बेस 64 इसे एन्कोड करते हैं। समान ध्वनि के बावजूद यह HTTP मूल प्रमाणीकरण नहीं है। नीचे कुछ नमूना कोड है जो इस लॉगिन अनुरोध को बनाएगा।

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) 

सर्वर साइड पर मैं पोस्ट डेटा लेने के लिए और base64 इसे फिर से उपयोगकर्ता नाम और पासवर्ड की जानकारी प्राप्त करने को डिकोड।

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

समस्या सामग्री प्रकार है। यदि मैं क्लाइंट (एप्लिकेशन/gooblygop) में अज्ञात सामग्री-प्रकार निर्दिष्ट करता हूं, तो फ्लास्क POST डेटा को request.data पर प्रकट करता है और मैं बेस 64 स्ट्रिंग को डीकोड कर सकता हूं। यदि मैं सामग्री-प्रकार को डिफॉल्ट (एप्लिकेशन/एक्स-www-form-urlencoded) के रूप में छोड़ देता हूं, तो कच्चा डेटा request.data के संपर्क में नहीं आता है और मुझे नहीं पता कि बेस 64 एन्कोडेड स्ट्रिंग को कैसे पुनर्प्राप्त करें और इसका उपयोग कैसे करें।

मौजूदा क्लाइंट सॉफ़्टवेयर एक्स-www-form-urlencoded के लिए बहुत अधिक डिफ़ॉल्ट है, लेकिन मैं हमेशा उस मामले पर भरोसा नहीं कर सकता।

अनिवार्य रूप से, मुझे उस एन्कोडेड स्ट्रिंग तक पहुंचने के लिए एक विश्वसनीय, सर्वर-साइड विधि की आवश्यकता है इससे कोई फर्क नहीं पड़ता कि क्लाइंट प्रोग्राम किस प्रकार सामग्री प्रकार बताता है।

अन्य नोट्स: मैं PHP पृष्ठभूमि से आने वाले पायथन के लिए बहुत नया हूं। तो मैं सुझावों के लिए बहुत खुला हूं। साथ ही, यह परियोजना मुख्य रूप से व्यक्तिगत उपयोग के लिए है।

उत्तर

2

सामान्य mimetypes के साथ urlencoded पदों से निपटने के दौरान आप request.form ऑब्जेक्ट को देखना चाहते हैं। इस मामले में आप एक असामान्य रूप है, लेकिन यहाँ यह करने के लिए एक तरीका है:

# 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) 

आप शायद माइम प्रकार की जाँच करने के लिए प्रवेश बिट संशोधित करना चाहते हैं, यहाँ अपने मौजूदा सेटअप करने के लिए कम से कम परिवर्तन के साथ एक संस्करण है:

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

यह, पहले कोड नमूने के उत्पादन होता है दो अनुरोध के साथ:

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

आप json का उपयोग कर पोस्ट में अपने डेटा को पारित करने के लिए के बारे में सोचा है? फ्लास्क ने जेसन डेटा पास करने के लिए समर्थन में बनाया है। इसके अलावा, अगर आप आवेदन करने के लिए शीर्ष लेख में सामग्री प्रकार सेट/json तो फ्लास्क आप के लिए पोस्ट डेटा dejson स्वचालित रूप से होगा और request.json

यहाँ में रख का अनुरोध आवेदन

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() 

है इस बोतल को देखने

from flask import request 

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

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

मैं तुम्हें कर्ल का उपयोग कर के रूप में अच्छी तरह से अगर आप linux टर्मिनल का उपयोग कर रहे हैं परीक्षण का सुझाव है। यहां एक उदाहरण है

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

This is the username 
संबंधित मुद्दे