2016-03-12 60 views
1

嗯,我希望這是一個你以前沒有看到的問題。非常奇怪的Python 3字節串錯誤

我這裏粘貼代碼:

import binascii 
import urllib.request 
import urllib.parse 
client_id = '2da9e3d6414047c0000000000' # a made up string 
client_secret = 'fe5f334a1cf240000000000' # a made up string 

url = 'https://accounts.spotify.com/api/token' 
data = {'grant_type':'client_credentials'} 
data = urllib.parse.urlencode(data) 
login = client_id + ':' + client_secret 
encoded_login = binascii.b2a_base64(login.encode('ascii')) 
encoded_login = encoded_login.decode('utf-8') 
print(encoded_login) ## so you know it is a string indeed 

headers = {'Authorization': 'Basic ' + encoded_login} 
try: 
    req = urllib.request.Request(url, data.encode('ascii'), headers) 
    with urllib.request.urlopen(req) as response: 
     result = response.read() 
except: 
    raise Exception('some failure') 

我沒有改變任何東西讓每個人都能重現該問題。現在你可以看到encoded_login已經成功了一個字符串。但是如果你真的運行它,你應該得到'Basic'+ encoded_login作爲字節錯誤。

以下是錯誤我得到:

Invalid header value b'Basic MmRhOWUzZDY0MTQwNDdjMDAwMDAwMDAwMDpmZTVmMzM0YTFjZjI0MDAwMDAwMDAwMA==\n' 

如何有趣,什麼叫神奇!字符串concat +已被轉換爲字節串聯。你回購這個,你能分享你的想法是什麼原因?

由於

回答

2

的binascii.b2a_base64功能追加一個新行到其輸出:所述docs狀態:

轉換二進制數據用base64編碼的線的ASCII字符。 返回值是轉換後的行,包括換行符char。 新行被添加,因爲這個函數的原始用例是 ,爲它提供一系列57字節的輸入行,以獲得 符合MIME-base64標準的輸出行。

標題值中不允許換行,這就是爲什麼您會收到錯誤消息。該異常將報頭值報告爲字節,因爲python http客戶端代碼會將請求轉換爲字節以便通過網絡傳輸。

使用base64 module函數(例如base64.b64encode)來避免添加換行符。