문제

나는 장고를 사용합니다 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을 선불로 부를 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top