2012-09-12 5 views
9

에서 예상대로 작동하지 않는 것은내 장고 템플릿 부울 변수는 자바 스크립트 여기

<script> 
     var auth_status = "{{ user.is_authenticated }}" 
    </script> 

    {% block scripts %} {% endblock %} 

내 사이트에있는 스크립트의 나머지 블록 스크립트에 내 base.html 헤더의 코드입니다. (스크립트 블록 내에서 스크립트 태그 내에서) 나는이 코드를 가지고 아이 템플릿에서

,
  if (auth_status) { 
      //something 
     } 

이 켜져 있어야 오프는 경우에 따라 때 손에서 오류가 auth_status은 항상 참이다 사용자가 로그인했습니다. 오류가 아니어야하므로 Request_context가 템플리트에 전달되고 있습니다.

감사합니다 나는 당신의 auth_status 변수가 아닌 문자열 부울 것 같다 무엇을보고 들어

+2

질문에 대한 전망이 좋은 관계없는, 그러나 (user_is_authenticated가) {물건을 할 경우 '하는 것보다 인식; }'이 JS 변수의 값에 실제로 의존하는 경우 보안 문제가 될 수 있습니다. 사용자는 실행 전에 JS 변수의 값을 수정할 수 있습니다. –

+0

그래서 사용자가 어떻게 든 auth_status = true를 설정할 수 있다고 말하는가? 그래서 js var을 우회하는 것이 유효한 해결 방법이 될까요? 예 : if ({{user.is_authenticated | yesno : "true, false"}}) 대 if (auth_status) ?? –

+1

악의적 인 사용자가 귀하의 페이지 소스 코드를 가져 와서 그들이 원하는 모든 것을 바꿀 수 있습니다. ** ** 보안 클라이언트 측 (즉, JS에서)을 구현할 수있는 ** 방법이 **없고 ** 해결 방법은 없습니다 **, 모든 보안/액세스 제어는 서버 측에서 수행해야합니다 (즉, 당신의 파이썬 코드에서). JS는 동적으로 실행되는 응용 프로그램 코드의 확장이 아니며 다른 제약 조건 인 * 다른 내용 *입니다. –

답변

52

. javascript에 비어 있지 않은 문자열이있는 변수는 if 절에서 true으로 평가됩니다.

<script> 
    var auth_status = True; 
</script> 

파이썬의 진정한 부울 대문자됨에 : 즉,이 HTML을 생성하기 때문에

어쨌든,

<script> 
    var auth_status = {{ user.is_authenticated }}; 
</script> 

같은 작동하지 않습니다.

이 자바 스크립트를 파이썬에서 번역을 수행해야합니다 여기

<script> 
    var auth_status = {{ user.is_authenticated|yesno:"true,false" }}; 
</script> 

확인 예 아니요 워드 프로세서 : https://docs.djangoproject.com/en/dev/ref/templates/builtins/#yesno

+1

+1 좋은 대답,'yesno'의 좋은 사용. –

+0

와우! 고마워요. 두 언어의 대문자/소문자 차이점을 완전히 간과했습니다. –

+0

Python vars를 JS vars로 전달하는 좀 더 일반적인 해결책은 json을 사용하는 것입니다. py : context [ 'foo'] = json.dumps (a_py_list). 템플릿 . 이것은 대부분의 데이터 구조 및 부울에 대해 작동합니다. – Sean