2016-12-30 5 views
2

"Accept"HTTP 헤더의 해석 및 응답의 직렬화를 처리하기 위해 사용자 지정 CherryPy "도구"를 사용하지 않는 다중 표현 (미디어 유형)Content-Type을 변경 한 후 반환 된 콘텐츠가 자동으로 인코딩되지 않음

ValueError: Page handlers MUST return bytes. Use tools.encode if you wish to return unicode.

예 :

contentType = tools.accept.callable(media = ['application/json', 'text/html']) 

if contentType == 'application/json': 
    return json.dumps(studies) 
elif contentType == 'text/html': 
    ... 
엔터티 본문은 CherryPy하지만 특정 미디어 유형에 대해 적절하게 "콘텐츠 유형"HTTP 헤더를 설정 한 후 페이지 처리기에서 콘텐츠를 반환시 다음 ValueError 예외가 발생

JSON 표현이 HTML (기본값)으로 잘못 선언되지만이 방법은 두 미디어 유형 모두에서 작동합니다.

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': 
    ... 

여기서 JSON 콘텐츠를 문자열로 반환 할 때 예외가 발생합니다.

실제로는 tools.encode을 사용하려는 시도가 실제로 활성화되어 있으며 tools.encode.encoding에서 utf-8으로 명시 적으로 설정하면 실패합니다. HTML 표현에 대해서는 문제가 없으므로 JSON 표현에서도 작동해야하는 것처럼 보입니다.

현재 tools.encode에 대한 문서는 다소 희박한 것으로 보이므로 취할 수있는 최선의 방법은 즉시 명백하지 않습니다.

답변

1

CherryPy 인코딩 도구는 최상위 미디어 유형이 text (text/*) 일 때만 자동으로 콘텐츠를 인코딩합니다.

encode.text_only 설정으로이를 제어하는 ​​방법이 있지만 전역 적이므로 실제로 인코딩하면 안되는 콘텐츠를 반환 할 때 문제가 발생할 수 있습니다. 이 글을 쓰는 시점에서 미해결 문제는이 동작에 대한보다 세분화 된 제어를위한 기능 요청을 추적합니다 : #1123.

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).encode('utf-8') 
elif contentType == 'text/html': 
    ... 
+0

이 정답 표시 사항 : 본 이유

이 특정 상황에서이 문제를 해결하는 가장 적절한 방법은 수동으로 컨텐츠를 인코딩하는 것입니다. 추신 언제든지 풀 요청을 제안 해 주시기 바랍니다 :) – webKnjaZ

+0

@webKnjaZ 감사합니다. 가장 유용한 PR은 아마도 문서 교정 일 뿐이므로,이 기고가 (이 시나리오에서 다른 누군가가 놀라는 경우 쉽게 찾을 수 있기를 바랍니다)보다 더 기여하지 않을까 우려됩니다. 지금은 어쨌든 ;-). – tne

+0

어쨌든, 저는이 문제에 대한 언급을 여기에 추가했습니다 – webKnjaZ