2011-12-30 4 views
2

중첩 된 사전을 Mako 템플릿으로 반환하려고하면 작은 따옴표가 HTML 코드 '으로 바뀝니다 (브라우저의 소스 코드에서 보았습니다). 뷰에서피라미드에서 중첩 된 사전을 Mako 템플릿으로 되 돌리는 방법은 무엇입니까?

: 마코에서

@view_config(route_name='main', renderer='myproj:templates/main.mako') 
def main_view(request): 
    info = {'name': 'Some', 'age': 20} 
    return {'info': info, 'country': 'Ukraine'} 

:

<script type="text/javascript">func(${info})</script> 

브라우저의 소스 코드에서 :

<script type="text/javascript">func({&#39;name&#39;: &#39;Some&#39;, &#39;age&#39;: 20})</script> 

방법이 탈출 피하기 위해? (renderer='json'은 변형이 아니기 때문에 Mako에서 해당 사전이 필요합니다.)

+0

파이썬 (Python)과 마코 (Mako) 스 니펫에서 수행 한 작업의 예를 들어 본다면 아마도 대답 할 수 있습니다. –

+0

코드 예제로 내 질문을 편집했습니다. 미리 감사드립니다! –

+0

@Michael Merickel - 내 편집을 참조하십시오. –

답변

6

Mako는 기본적으로 이스케이프 문자열로 구성됩니다. 필터를 비활성화하려면 |n을 통해이 작업을 수행 할 수 있습니다. 특히 ${info|n}. 당신의 예에서

은, 그러나, 당신은 자바 스크립트 함수에 파이썬 사전을 전달하는 데 노력하고있다. 이것은 분명히 추가하지 않으며 파이썬 사전을 자바 스크립트에서 사용할 수있는 것으로 바꿀 필요가 있습니다. 실제로 여기서하고자하는 것은 파이썬 사전을 문자열로 변환 한 다음 자바 스크립트 코드에 필터링하지 않고 출력하는 것입니다.

이 최대 prettied 할 수 있지만, 아이디어는 파이썬에서 당신이 할 것입니다 :

@view_config(route_name='main', renderer='myproj:templates/main.mako') 
def main_view(request): 
    info = json.dumps({'name': 'Some', 'age': 20}) 
    return {'info': info, 'country': 'Ukraine'} 

와 청상 아리에 당신이 할 : 기본 피라미드 세트에 의해

<script type="text/javascript">func(${info|n})</script> 

h 필터를 사용하는 마코 모든 것을 빠져 나가는 것입니다 (보고있는 문제). 기본 필터는 편집 할 수 있지만 일반적으로 다른 코드의 잠재적 인 부작용 때문에 가장 좋은 생각은 아닙니다. 다른 가능성은 유효한 javascript 코드를 얻기 위해 사전의 __str__ 구현에 의존하는 것입니다. 이 경우 아무 것도 직렬화 할 필요가 없으며 적어도 (이 경우에는) ${info|str,n}을 실행하여 원하는 결과를 얻을 수 있습니다.

+0

예, 당신의 대답은 맞습니다만, 아마 json으로 덤핑하고'| n '을 말합니다. 내 장고 프로젝트에서 mako를 사용하기 때문에 mako 사전은 json없이 잘 실행되고 mako에서 벗어납니다. 감사! –

+1

업데이트 된 대답, 나는 django-mako 구현을 살펴 봤으며 dicts에 대해서는 특별한 것도 (피라미드도 마찬가지)하지 않습니다. django-mako는 기본적으로 탈출을 설정하지 않으므로 사용자 (XSS 취약성)의 입력을 표시하는 사람에게는 위험합니다. –

+1

json.dumps ({ 'name': 'Some', 'age': 20}). encode ('string-escape')'; json 페이로드에 작은 따옴표가 포함 된 텍스트가 있으면 자바 스크립트가 중단됩니다. –

관련 문제