2009-09-14 5 views
2

Django의 render_to_response을 사용하여 XML 문서를 반환합니다. 이 특정 XML 문서는 플래시 기반 차트 라이브러리를위한 것입니다. 라이브러리는 XML 문서가 BOM (byte order marker)으로 시작해야합니다. 어떻게하면 장고가 응답에 BOM을 미리 만들 수 있습니까?장고의 BOM to XML 응답 앞에

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) 

답변

2

UTF-8에는 BOM이 없으므로 BOM (Byte Order Mark)에 대해 실제로 말하는 것이 아닙니다. 예제 코드에서 라이브러리는 텍스트에 설명 할 수없는 이유로 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) 
+0

내가 * UTF-8이라고 말하고 싶다. 일부 (일반적으로 Microsoft에서 파생 된) 소프트웨어는 무의미하고 해롭지 만 BOM을 UTF-8에 넣는 것을 좋아합니다. XML 판독기가 필요하지만 XML 판독기가 전혀 필요하지 않습니다. – bobince

+0

UTF-8에는 바이트 순서가 없으므로 BOM과 같은 것은 UTF-8에 없습니다. 일부 소프트웨어가 임의의 가비지 바이트가 파일에 존재하는지 여부에 따라 달라지면 이는 다른 것입니다. –

+0

@Vebjorn : 편집 한 질문을 반영하도록 답변을 업데이트했습니다. 코드가 이미 거의 정확합니다. –

0

간단한 일이 BOM을 제거하지 이맥스를 구성 할 수 있습니다.

그러나 render_to_response는 복잡한 기능이 아닙니다. 기본적으로 :

def render_to_response(*args, **kwargs): 
    return HttpResponse(loader.render_to_string(*args, **kwargs)) 

쉽게 render_to_string을 호출하고 BOM 앞에 추가 할 수 있습니다.

1

존 밀리 킨의 대답의 이전 버전을 기반으로이 솔루션은, 내가 허용 된 것보다 더 복잡하지만, 나는 완벽 여기를 포함하고있어이보십시오. 먼저 미들웨어 클래스를 정의하십시오.

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 

을 이제 특정 응답에 BOM을 앞에 추가하기 위해 render_to_response("foo.xml", mimetype="text/xml", bom=True)을 할 수 있습니다.