Проблема кодирования в движке приложения при отправке форм multipart/form-data

У меня есть простая форма, которая отправляет изображение в blobstore и заголовок для изображения. Это работает на моем локальном devserver, но когда я разворачиваю свой код, буквы non 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), так что это мое последнее средство, прежде чем я просто изменил свой дизайн и разделил формы.

Ответы

Ответ 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 из стандартной библиотеки может декодировать его для вас.

Ответ 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())) insted of photourl = images.get_serving_url (str (upload_files [0].key()))