【问题标题】:Encoding problem in app engine when submitting multipart/form-data forms提交多部分/表单数据表单时应用引擎中的编码问题
【发布时间】:2010-09-02 06:11:28
【问题描述】:

我有一个简单的表单,可以将图像提交到 blobstore 和图像的标题。 这适用于我的本地开发服务器,但是当我部署我的代码时,标题中的非 ascii 字母会因某种 ascii 和 hex 的混合而变得乱码。例如 Ísland 变成 =CDsland。请注意,我使用 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 作为标题中的第一个值。 utf-8 也适用于我的所有其他形式。只是变得乱码的多部分形式。无论如何,这是我的表格:

<form action="{{ uploadurl }}" enctype="multipart/form-data" method="post">
  <div><label>Title</label><input type="text" name="title" class="string" /></div>
  <div><label>Picture</label><input type="file" name="img"/></div>
  <div style="margin-top:10px;"><input type="submit" value="Add picture" /></div>
  <input type="hidden" value="{{ album.key }}" name="alid"/>
</form>

这是处理表单的类:

# handler for posting photos
class PostPhoto(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        upload_files =  self.get_uploads('img')
        photourl = images.get_serving_url(str(upload_files[0].key()))
        photo = Photo()
        #because of multipart/form-data
        photo.title = self.request.get("title")
        photo.photourl = photourl
        photo.photoalbum = PhotoAlbum.get(self.request.get('alid'))     
        photo.put()

有人知道我该如何解决这个问题吗?我必须做一些服务器端编码/解码吗?我已经尝试在谷歌上搜索但没有结果(python newb),所以这是我在更改设计并拆分表单之前的最后手段。

【问题讨论】:

  • 你用什么来确定服务器上的标题是什么?如果您不使用 blobstore 直接发布到处理程序,这是否有效?
  • 无论何时通过 HTTP 提供您的网页,元内容类型标记是否出现在 HTML 头部的顶部都是完全无关的。有点体面的网络浏览器将使用 HTTP 响应标头中的那个。另请参阅 w3 规范 w3.org/TR/html4/charset.html#h-5.2.2
  • 目前 appegine SDK 1.7.2 尚未修复,但生产行为略有变化:“Ísland”变为“zXNsYW5k”。 unicode(base64.b64decode('zXNsYW5k'), 'iso_8859-2')

标签: python google-app-engine character-encoding


【解决方案1】:

这是一个已知的错误。 http://code.google.com/p/googleappengine/issues/detail?id=3761

恢复原始数据是一个问题:

>>> import quopri
>>> t = unicode(quopri.decodestring('=CD'), 'iso_8859-2')
>>> print t
Í

【讨论】:

    【解决方案2】:

    我正在使用 Django nonrel 并用这个中间件修复它:

    http://code.google.com/p/googleappengine/issues/detail?id=2749#c33

    import logging
    import quopri
    log = logging.getLogger(__name__)
    
    class BlobRedirectFixMiddleware(object):
        def process_request(self, request):
            if request.method == 'POST' and 'HTTP_X_APPENGINE_BLOBUPLOAD' in request.META and request.META['HTTP_X_APPENGINE_BLOBUPLOAD'] == 'true':
                request.POST = request.POST.copy()
                log.info('POST before decoding: %s' % request.POST)
                for key in request.POST:
                    if key.startswith('_') or key == u'csrfmiddlewaretoken':
                        continue
                    value = request.POST[key]
                    if isinstance(value,(str, unicode)):
                        request.POST[key] = unicode(quopri.decodestring(value), 'iso_8859-2')
                log.info('POST after decoding: %s' % request.POST) 
            return None
    

    【讨论】:

      【解决方案3】:

      =CD 是 Í 的引用可打印表示。

      我无法解释为什么生产服务器会在 dev_appserver 没有的情况下将这些数据作为引用打印提供给您,但是标准库中的 quopri 模块可以为您解码。

      【讨论】:

      • 当我打印 quopri.encodestring("Í") 时,我得到 =C3=8D,当我打印 quopri.decodestring("=CD") 时,我只得到一个 � 但这实际上是关闭我已经做到了:)
      • 在打印之前,您可能需要将结果进一步编码为 utf-8(或您使用的任何编码)。
      【解决方案4】:

      此评论解释了如何解决该问题并包含 appengine_config.py,它使一切正常:http://code.google.com/p/googleappengine/issues/detail?id=2749#c21

      这里不包含代码,因为我不知道如何附加文件,并且内联包含很大。

      【讨论】:

        【解决方案5】:

        你试过 photourl = images.get_serving_url(unicode

        (upload_files[0].key())) 插入 photourl = images.get_serving_url(str(upload_files[0].key()))

        【讨论】:

        • 问题不在于网址。 url 是由我从 blobstore 获得的键值组成的。它与标题。 photo.title = self.request.get("title") 我尝试使用 unicode(self.request.get("title")) 并抛出异常。
        • 如果你能告诉我们抛出了什么异常就太好了!因为我们可以帮助您解码到好的编码。
        【解决方案6】:

        将较新的 webob 库添加到您的 app.yaml 中:

        libraries:
        - name: webapp2
          version: "2.5.2"
        - name: webob
          version: "1.2.3"
        

        来自:https://code.google.com/p/googleappengine/issues/detail?id=2749

        【讨论】:

          猜你喜欢
          • 2013-03-06
          • 1970-01-01
          • 2017-06-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-04
          • 2012-06-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多