Eine Ressource mit mehreren Darstellungen (Medientypen), die keine benutzerdefinierten CherryPy-Tools verwenden, um die Interpretation des HTTP-Headers "Accept" und die Serialisierung der Antwort zu verarbeiten Entitätskörpers wirft CherryPy die folgende ValueError
Ausnahme auf den Inhalt von der Seite Handler zurückkehrt, nachdem die "Content-Type" HTTP-Header eine entsprechende Einstellung, aber für bestimmte Medientypen nur:Zurückgegebener Inhalt wird nicht automatisch nach Änderung des Inhaltstyps codiert
ValueError: Page handlers MUST return bytes. Use tools.encode if you wish to return unicode.
Beispiel:
contentType = tools.accept.callable(media = ['application/json', 'text/html'])
if contentType == 'application/json':
return json.dumps(studies)
elif contentType == 'text/html':
...
Dies funktioniert für beide Medientypen, obwohl die JSON-Darstellung fälschlicherweise als HTML (Standard) deklariert wird.
contentType = tools.accept.callable(media = ['application/json', 'text/html'])
response.headers['Content-Type'] = "{mediaType}; charset=utf-8".format(mediaType = contentType)
if contentType == 'application/json':
return json.dumps(studies)
elif contentType == 'text/html':
...
Hier wird die obige Ausnahme ausgelöst, wenn der JSON-Inhalt als Zeichenfolge zurückgegeben wird.
Versuche zu gewährleisten tools.encode
ist in der Tat aktiviert und tools.encode.encoding
auf utf-8
explizit (auch wenn es die Standardeinstellung ist) fehlschlagen. Die Dinge funktionieren für die HTML-Darstellung, also scheint es, dass es auch für die JSON-Darstellung funktionieren sollte.
Derzeit scheint die Dokumentation für tools.encode
eher spärlich, was die beste Vorgehensweise ist, ist nicht sofort offensichtlich.
Bitte markieren. P.S. Fühlen Sie sich frei, eine Pull Request vorschlagen :) – webKnjaZ
@webKnjaZ Danke, ich fühle mich besser, es mit einer Bestätigung zu tun. Eine sehr nützliche PR wäre wahrscheinlich nur eine Dokumentation, aber ich befürchte, dass sich mein Beitrag nicht auf mehr als diese Frage und Antwort erstreckt (was hoffentlich leicht gefunden werden kann, wenn jemand anderes von diesem speziellen Szenario überrascht wird). Für jetzt sowieso ;-). – tne
Wie auch immer, ich habe hier eine Referenz zu diesem Thema platziert – webKnjaZ