2012-04-12 19 views
6

मैं का उपयोग कर अजगर में एक छोटी सी वेब सेवा developping हूँ:फ्लास्क - हेडर को यूनिकोड में परिवर्तित नहीं किया जाता है?

  • बोतल (v। 0.8)
  • तूफान ORM (v 0.19।)
  • अपाचे mod_wsgi साथ

मेरे पास है एक कस्टम HTTP शीर्षलेख, Unison-UUID जो मैं अपने डेटाबेस में जानकारी पुनर्प्राप्त करने के लिए किसी बिंदु पर उपयोग कर रहा हूं।

यहाँ है (थोड़ा सादगी के लिए फिर से लिखा) झलकी है कि मैं कुछ समस्या आ रही:

uuid = flask.request.headers['Unison-UUID'] 
store = storm.locals.Store(my_database) 
user = store.get(models.User, uuid) 

वर्ग User है और अधिक या कम इस तरह:

class User(Storm): 
    uuid = Unicode(primary=True) 
    # Other columns.... 

कोड ऊपर में विफल रहता है निम्न तरीका:

File "/Users/lum/Documents/unison-recsys/www/api/unison/unison.py", line 27, in decorated 
    user = g.store.get(models.User, uuid) 
    File "/Users/lum/Documents/unison-recsys/venv/lib/python2.6/site-packages/storm/store.py", line 165, in get 
    variable = column.variable_factory(value=variable) 
    File "/Users/lum/Documents/unison-recsys/venv/lib/python2.6/site-packages/storm/variables.py", line 396, in parse_set 
    % (type(value), value)) 
TypeError: Expected unicode, found <type 'str'>: '00000000-0000-0000-0000-000000000009' 

मुझे वास्तव में समझ में नहीं आता है यह हो रहा है और मैं इसके बारे में क्या कर सकता हूं। मैंने सोचा Flask was 100% unicode

हेडर वैल्यू को डीकोड करना एक त्वरित फिक्स है, यानी uuid = uuid.decode('utf-8')। क्या यह वास्तव में क्या करने की जरूरत है? यह थोड़ा सा हैक लगता है। क्या यूनिकोड को मैन्युअल रूप से "डीकोड" किए बिना सीधे प्राप्त करने का कोई तरीका नहीं है?

+3

रुचि का हो सकता: http://stackoverflow.com/q/818122/311220 http: // stackoverflow.com/q/7567154/311220 – Acorn

उत्तर

12

की http://flask.pocoo.org/docs/api/#flask.request हम पढ़ हो सकता है क्या

अनुरोध ऑब्जेक्ट Request सबक्लास का एक उदाहरण है और प्रदान करता है सभी गुण Werkzeug परिभाषित करता है।

शब्द http://werkzeug.pocoo.org/docs/wrappers/#werkzeug.wrappers.Request जहाँ हम

Request और Response वर्गों को पढ़ने के लिए Request लिंक BaseRequest और BaseResponse कक्षाएं उपवर्ग और सभी mixins लागू WERKZEUG प्रदान करता है:

शब्द BaseRequesthttp://werkzeug.pocoo.org/docs/wrappers/#werkzeug.wrappers.BaseRequest के लिंक जहां हम

पढ़ते हैं

शीर्षलेख
डब्लूएसजीआई पर्यावरण से शीर्षलेख EnvironHeaders के रूप में शीर्षलेख।http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.EnvironHeaders को

शब्द EnvironHeaders लिंक जहां हम पढ़

इस रूप में हेडर एक ही इंटरफेस प्रदान करता है और एक WSGI वातावरण से निर्माण किया है।

शब्द हेडर है ... नहीं, यह जुड़ा हुआ है, लेकिन नहीं कर रहा है यह http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.Headers जहां हम पढ़

हेडर से जोड़ा गया है चाहिए ज्यादातर अजगर wsgiref.headers.Headers वर्ग

के साथ संगत है

जहां वाक्यांश wsgiref.headers.Headershttp://docs.python.org/dev/library/wsgiref.html#wsgiref.headers.Headers से लिंक है जहां हम

पढ़ते हैं

मैपिंग-जैसी ऑब्जेक्ट रैपिंग हेडर बनाएं, जो PEP 3333 में वर्णित अनुसार हेडर नाम/मान टुपल्स की एक सूची होनी चाहिए।

वाक्यांश http://www.python.org/dev/peps/pep-3333/ को PEP 3333 लिंक जहां वहाँ किस प्रकार हेडर होना चाहिए की लेकिन थोड़ी देर हम इस बयान

WSGI इसलिए के दो प्रकार परिभाषित करता है खोजने के लिए शब्द के लिए खोज हेडर के बाद कोई स्पष्ट परिभाषा "स्ट्रिंग":

"Native" strings (which are always implemented using the type named str) 
that are used for request/response headers and metadata 
"Bytestrings" (which are implemented using the `bytes` type in Python 3, 
and `str` elsewhere), that are used for the bodies of requests and 
responses (e.g. POST/PUT input data and HTML page outputs). 

है यही कारण है कि अजगर 2 में आप हेडर मिल strunicode के रूप में नहीं।

अब डिकोडिंग पर जाएं।

न तो अपने .decode('utf-8') है और न ही Mensi के .decode('ascii') (और न ही आँख बंद करके किसी अन्य एन्कोडिंग उम्मीद है), क्योंकि In theory, HTTP header field values can transport anything; the tricky part is to get all parties (sender, receiver, and intermediates) to agree on the encoding. सार्वभौमिक अच्छा है। कहा करने के बाद मुझे लगता है कि आप के अनुसार कार्य करना चाहिए जूलियन Reshke के advice

इस प्रकार, यह करने के लिए सुरक्षित तरीका इस तरह के आरएफसी में परिभाषित एक के रूप में उस के शीर्ष , पर ASCII से चिपक, और चुनें कोई एन्कोडिंग है 5 9 87.

यह जांचने के बाद कि आपके द्वारा समर्थित उपयोगकर्ता एजेंट (ब्राउज़र) ने इसे कार्यान्वित किया है।

RFC 5987 की

शीर्षक अक्षर समूह और है भाषा एन्कोडिंग हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल के लिए (HTTP) हैडर फील्ड पैरामीटर

+2

बहुत विस्तृत उत्तर, बहुत बहुत धन्यवाद! – lum

+0

+1 (+10 अगर मैं कर सकता था)! –

0

शीर्षलेख मान ASCII हैं, Acorn द्वारा जुड़े प्रश्न देखें।

आप यहाँ कर रहा है या तो इसे मैन्युअल रूप से डिकोड तरह तुमने किया था (यद्यपि आप uuid.decode('ascii') और नहीं utf-8 का उपयोग करना चाहिए) या बदलने के अपने क्षेत्र RawStr बजाय Unicode

+0

शीर्षलेख मान ** ** ** ASCII नहीं हैं, http://stackoverflow.com/a/818188/95735 –

+0

देखें 'RawStr' का उल्लेख करने के लिए धन्यवाद। यह वास्तव में मेरे विशिष्ट मामले में बेहतर विकल्प हो सकता है। – lum

संबंधित मुद्दे

 संबंधित मुद्दे