2012-10-22 28 views
2

我有一個Python應用程序引擎在Python表單提交該POSTS文本到服務器,並且文本被編碼引用的Printables編碼。 我張貼碼是這樣的:如何正確解碼Django HTML模板中引用的可打印編碼

<form action={{ upload_url }} method="post" enctype="multipart/form-data"> 
<div class="sigle-form"><textarea name="body" rows="5"></textarea></div> 
<div class="sigle-form"><input name="file" type="file" /></div> 
</form> 

然後取出self.request.get('body')的結果將與引Printables的編碼進行編碼。我將它存儲在文本DB.textProperty()中,稍後使用Django將文本發送到HTML模板。當我使用{{ body }}寫出變量時,結果是用Quoted可打印編碼編寫的,而且似乎沒有在Django HTML模板中解碼這種方法的方法。 有沒有任何方式編碼的文本在正文中發送的另一種方式比引用Printables?如果沒有,如何解碼Django HTML模板中的這種編碼?

提交文本「ÅØÆ」的結果編碼爲「xdjG」,所以引用的Prinables的總和也以某種方式添加到了輸出中。這發生在編碼文本中存在多個特殊字符時。一個普通的「ø」被編碼爲= F8。

編輯:我只在生產中遇到這個問題,並且this thread似乎在談論同樣的問題。

如果其他人在這裏堆棧溢出正在做表單提交blobs和åæøè字符,請回答這個問題,你已經解決了它!

回答

1

好了兩天後,這個問題的工作我終於解決了。它似乎是Google App Engine中的一個錯誤,它使得編碼在生產中成爲現實。在製作時,文本有時用Quoted Printable編碼進行編碼,有時用base64編碼進行編碼。奇怪的。這裏是我的解決方案:

postBody = self.request.get('body')  
postBody = postBody.encode('iso-8859-1') 
DEBUG = os.environ['SERVER_SOFTWARE'].startswith('Dev') 
if DEBUG: 
    r.body = postBody 
else: 
    postBody += "=" * ((4 - len(postBody) % 4) % 4) 
    b64 = base64.urlsafe_b64decode(postBody) 

儘管得到的B64不能存儲在數據存儲,因爲它不是ASCII編碼

'ascii' codec can't decode byte 0xe5 in position 5: ordinal not in range(128) 
0

不確定引用的Printables是什麼,但你試過安全嗎?

{{ body|safe }} 

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#safe

+0

是的。它似乎沒有正確解碼Quoted Printable編碼。 – hakonbogen

+0

這很奇怪,因爲您不希望任何階段都會發生任何轉換。你有沒有試過不存儲它,直接寫回來確定存儲階段是否重新格式化數據? –

+0

是的,我這樣做的接收方法: 'postBody = self.request.get( '主體') self.response.out.write(postBody)' 已歷經然後它已編碼的文本以引用Printable編碼 – hakonbogen

0

我使用Python的quopri模塊解碼解決了類似的問題該字符串在傳遞給HTML模板之前。

import quopri 
body = quopri.decodestring(body) 

這似乎是與multipart/form-data enctype有關。可引用的可打印編碼應用於textarea輸入,然後在我的情況下,通過blobstore上傳鏈接提交。 blobstore將文本返回到我的上傳處理程序,仍然以編碼形式。