2012-10-22 25 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将文本返回到我的上传处理程序,仍然以编码形式。