Ответ 1
Это известная ошибка. http://code.google.com/p/googleappengine/issues/detail?id=3761
Возврат к исходным данным:
>>> import quopri
>>> t = unicode(quopri.decodestring('=CD'), 'iso_8859-2')
>>> print t
Í
У меня есть простая форма, которая отправляет изображение в 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), так что это мое последнее средство, прежде чем я просто изменил свой дизайн и разделил формы.
Это известная ошибка. http://code.google.com/p/googleappengine/issues/detail?id=3761
Возврат к исходным данным:
>>> import quopri
>>> t = unicode(quopri.decodestring('=CD'), 'iso_8859-2')
>>> print t
Í
Я использую 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
= CD - это цитируемое печатное представление Í.
У меня нет объяснений, почему производственный сервер предоставит вам эти данные в качестве кавычки для печати, когда dev_appserver этого не сделает, но модуль quopri
из стандартной библиотеки может декодировать его для вас.
В этом комментарии объясняется, как исправить эту проблему и включает appengine_config.py, что заставляет все работать: http://code.google.com/p/googleappengine/issues/detail?id=2749#c21
Я не включаю здесь код, потому что я не знаю, как подключить файл, и он довольно большой, чтобы быть включенным в строку.
Вы попробовали photourl = images.get_serving_url (unicode
(upload_files [0].key())) insted of photourl = images.get_serving_url (str (upload_files [0].key()))
Добавьте новую библиотеку 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