2010-03-31 38 views
1

我正在Django工作,並使用urllib2和simplejson來解析API中的一些信息。Django:在處理Latin1中的HTTP響應時出現Python編碼錯誤?

問題是API以Latin-1編碼的形式返回信息,並且偶爾會出現一個字符,導致Django因編碼錯誤而崩潰。這是我的代碼:

get_person_id_url = "http://www.domain.com/api/get?" + \ 
    "key=KEY&num="+ urllib2.quote(number) + "&always_return=true&output=js" 
request = urllib2.Request(get_person_id_url, None, {'Referer': ''}) 
response = urllib2.urlopen(request) 
results = json.load(response) 
person_id = results["person_id"] 

我知道我可以使用這樣的轉Latin1的字符串爲UTF8:

responseString = responseString.decode('latin1').encode('utf-8') 

,但它似乎對字符串這只是工作,所以我不完全確定如何或在何處應用它在上面的代碼。我應該解碼什麼以及在發生錯誤之前在哪裏捕獲錯誤?

不幸的是,我不記得使用什麼API調用來返回一個會使Django崩潰的字符 - 所以在它上線之前我無法做很多測試。我希望StackOverflow可以幫助...謝謝!

回答

0

致電response.read()獲取響應的數據。然後在try/except做你的latin1解碼和json加載。一般來說,如果你在異常處理程序中封裝潛在的引起錯誤的操作,並且適當地照顧它們(至少將它們記錄在某處以便將來在某個時刻處理它們),那麼Django不應該崩潰。

+0

謝謝。我能做類似「response_string = response.read()(做解碼和編碼)results = json.load(response_string)」的東西,還是需要將response_string轉回到simplejson可以處理的對象中?這在一定程度上是我的問題 - 如何讓它回到simplejson,它的文檔非常有限。 – AP257 2010-03-31 15:51:56

+0

'json.loads'簡單接受一個字符串(Json格式)。所以,例如,如果你的Python字符串是's ='{「a」:1}'',那麼你可以執行'd = json.loads(s)'並取回一個Python字典。同樣,'s = json.dumps(d)'會產生一個json編碼的字符串。我(我懷疑大多數人)只使用'dumps'和'loads'方法。 – rlotun 2010-03-31 19:11:19

相關問題