2010-09-02 1 views
13

Ich habe ein einfaches Formular, das ein Bild an den Blobstore und einen Titel für das Bild übermittelt. Dies funktioniert auf meinem lokalen devserver, aber wenn ich meinen Code bereitstellen, werden nicht-ASCII-Buchstaben im Titel mit einer Art Mischung aus ASCII und Hex verzerrt. Zum Beispiel wird Island zu = CDland. Hinweis: Ich verwende <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> als ersten Wert in der Kopfzeile. Auch utf-8 funktioniert für alle meine anderen Formen. Nur die mehrteilige Form, die verstümmelt wird. Auch immer das ist meine Form:Codierung Problem in der App-Engine beim Senden von Multipart/Formulardatenformularen

<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> 

Und das ist die Klasse Umgang mit der 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() 

Hat jemand eine Ahnung, wie ich dieses Problem beheben? Muss ich eine serverseitige Kodierung/Dekodierung durchführen? Ich habe versucht, dafür googeln ohne Ergebnis (Python Newb), so ist dies meine letzte Zuflucht, bevor ich nur mein Design ändern und die Formulare aufteilen.

+0

Was verwenden Sie zu bestimmen, was der Titel auf dem Server? Und funktioniert das, wenn Sie direkt an einen Handler posten, ohne blobstore zu verwenden? –

+0

Dass das Meta-Content-Type-Tag oben im HTML-Header vorhanden ist, ist völlig unkritisch, wenn Ihre Webseite über HTTP bedient wird. Ein bisschen anständiger Webbrowser wird stattdessen den im Header der HTTP-Antwort verwenden. Siehe auch w3 spec http://www.w3.org/TR/html4/charset.html#h-5.2.2 – BalusC

+0

Momentan ist SDK 1.7.2 noch nicht installiert, aber das Produktverhalten hat sich leicht geändert: 'Island 'wird' zXNsYW5k '. Unicode (base64.b64decode ('zXNsYW5k'), 'iso_8859-2') – keiw

Antwort

1

haben Sie versucht photourl = images.get_serving_url (Unicode

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

+0

Das Problem ist nicht mit der URL. Die URL wird nur aus dem Schlüsselwert erstellt, den ich vom Blobstore erhalte. Es ist mit dem Titel. Foto.title = self.request.get ("title") Ich habe versucht mit Unicode (self.request.get ("title")) und es wurde eine Ausnahme ausgelöst. –

+0

Es wäre toll, wenn Sie uns sagen, welche Ausnahme geworfen wird! Wie können wir Ihnen helfen, die gute Codierung zu dekodieren. – boblefrag

2

= CD ist die druckbare Darstellung von Í.

Ich habe keine Erklärung, warum der Produktionsserver Ihnen diese Daten als quoted-printable geben würde, wenn der dev_appserver nicht, aber das quopri Modul aus der Standardbibliothek kann es für Sie decodieren.

+0

Wenn ich quopri.encodetring ("Í") drucke, bekomme ich = C3 = 8D und wenn ich quopri.decodestring ("= CD") drucke, bekomme ich nur ein Aber das ist eigentlich das Schliessen das ich dazu bekommen habe Richtig :) –

+0

Möglicherweise müssen Sie das Ergebnis vor dem Drucken weiter in utf-8 (oder die von Ihnen verwendete Kodierung) kodieren. – geoffspear

5

ich Django nonrel bin mit und fixiert es mit dieser Middleware:

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 
2

Dieser Kommentar erklärt, wie das Problem behoben werden kann und enthält die Datei appengine_config.py, mit der alles funktioniert: http://code.google.com/p/googleappengine/issues/detail?id=2749#c21

Ich füge den Code hier nicht ein, weil ich keine Ahnung habe, wie man eine Datei anhängt, und es ist ziemlich groß, inline eingeschlossen zu werden.

Verwandte Themen