Django의 XML 응답으로 BOM을 선출하십시오
-
07-07-2019 - |
문제
나는 장고를 사용합니다 render_to_response
XML 문서를 반환합니다. 이 특정 XML 문서는 플래시 기반 차트 라이브러리를위한 것입니다. 라이브러리는 XML 문서가 BOM (바이트 주문 마커)로 시작해야합니다. Django가 BOM을 응답으로 전환시키는 방법은 무엇입니까?
BOM을 템플릿에 삽입하는 데 작동하지만 EMACS는 파일을 편집 할 때마다 제거하기 때문에 불편합니다.
다시 쓰려고했습니다 render_to_response
다음과 같이, BOM이 UTF-8 인코딩되어 있기 때문에 실패합니다.
def render_to_response(*args, **kwargs):
bom = kwargs.pop('bom', False)
httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
s = django.template.loader.render_to_string(*args, **kwargs)
if bom:
s = u'\xef\xbb\xbf' + s
return HttpResponse(s, **httpresponse_kwargs)
해결책
UTF-8에는 BOM이 없기 때문에 실제로 BOM (바이트 주문 마크)에 대해 말하는 것이 아닙니다. 예제 코드에서 라이브러리는 텍스트에 3 개의 쓰레기 바이트가 설명 할 수없는 이유로 선불되기를 기대합니다.
코드는 거의 정확하지만 바이트를 바이트, 캐릭터가 아닙니다. 이 시도:
def render_to_response(*args, **kwargs):
bom = kwargs.pop('bom', False)
httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
s = django.template.loader.render_to_string(*args, **kwargs)
if bom:
s = '\xef\xbb\xbf' + s.encode("utf-8")
return HttpResponse(s, **httpresponse_kwargs)
다른 팁
이전 버전의 John Millikin의 답변을 기반으로 한이 솔루션은 내가 받아 들인 것보다 더 복잡하지만 완전성을 위해 여기에 포함시킵니다. 먼저, 미들웨어 클래스 정의 :
class AddBOMMiddleware(object):
def process_response(self, request, response):
import codecs
if getattr(response, 'bom', False):
response.content = codecs.BOM_UTF8 + response.content
return response
설정에서 Middleware_Classes에 이름을 추가하십시오. 그런 다음 재정의하십시오 render_to_response
:
def render_to_response(*args, **kwargs):
bom = kwargs.pop('bom', False)
httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
rendered = django.template.loader.render_to_string(*args, **kwargs)
response = django.http.HttpResponse(rendered, **httpresponse_kwargs)
if bom:
response.bom = True
return response
이제 할 수 있습니다 render_to_response("foo.xml", mimetype="text/xml", bom=True)
BOM을 특정 응답으로 전제하기 위해.
가장 간단한 것은 BOM을 제거하지 않도록 EMAC를 구성하는 것입니다.
그러나 render_to_response는 복잡한 기능이 아닙니다. 기본적으로 :
def render_to_response(*args, **kwargs):
return HttpResponse(loader.render_to_string(*args, **kwargs))
render_to_string을 쉽게 호출하고 BOM을 선불로 부를 수 있습니다.