Django 템플릿 시스템에서 메소드 호출에 대한 고려 사항

4773 단어 Django
Method Call Behavior
Method calls are slightly more complex than the other lookup types. Here are some things to keep in mind:
If, during the method lookup, a method raises an exception, the exception will be propagated, unless the exception has an attribute silent_variable_failure whose value is True. If the exception does have asilent_variable_failure attribute, the variable will render as an empty string, for example:
>>> t = Template("My name is {{ person.first_name }}.")
>>> class PersonClass3:
...     def first_name(self):
...         raise AssertionError, "foo"
>>> p = PersonClass3()
>>> t.render(Context({"person": p}))
Traceback (most recent call last):
...
AssertionError: foo

>>> class SilentAssertionError(AssertionError):
...     silent_variable_failure = True
>>> class PersonClass4:
...     def first_name(self):
...         raise SilentAssertionError
>>> p = PersonClass4()
>>> t.render(Context({"person": p}))
u'My name is .'


A method call will only work if the method has no required arguments. Otherwise, the system will move to the next lookup type (list-index lookup).
Obviously, some methods have side effects, and it would be foolish at best, and possibly even a security hole, to allow the template system to access them. Say, for instance, you have a BankAccount object that has a delete() method. If a template includes something like {{ account.delete }}, where account is a BankAccount object, the object would be deleted when the template is rendered! To prevent this, set the function attribute alters_data on the method:
def delete(self):
    # Delete the account
delete.alters_data = True

The template system won’t execute any method marked in this way. Continuing the above example, if a template includes {{ account.delete }} and the delete() method has the alters_data=True, then thedelete() method will not be executed when the template is rendered. Instead, it will fail silently. 다음은 Django 문서의 템플릿 시스템에서 메소드 호출에 대한 내용입니다.방법이 호출되는 동안 호출된 방법이 이상을 일으키면 이 이상이silentvariable_failure라는 속성과 값이true라면 이 때 발생하는 이상은 전파되지 않고 문자열에 빈 문자열로 대체됩니다.만약 속성 값이 없다면 이 이상을 전파할 것이다.템플릿 시스템에서 호출하는 방법, 이 방법은 매개 변수를 받아들이지 않아야 합니다. 그렇지 않으면 이 방법은 호출되지 않고, 점호가 인용한 검색 규칙에 따라 다음 검색을 진행합니다.또한 현재 Blank Account 클래스를 추가하십시오. 이 클래스는 계정의 대상이 있고 delete 방법이 있습니다.템플릿 시스템의 변수에 {{{account.delete}}를 추가하면 예상치 못한 문제가 발생할 수 있습니다.템플릿의 account.delete와 account 대상이 delete를 호출하는 것은 같은 뜻이 아닙니다. 그러면 코드가 중복되는 상황이 발생합니다.그래서 Django는 계정이라는 대상을 삭제하여 불필요한 번거로움을 초래한다.메소드 설정alters데이터라는 속성은 이런 상황이 발생할 때 프로그램이 어떤 방법도 사용하지 않고 묵묵히 종료합니다.Django 템플릿 시스템에서 존재하지 않는 변수나 방법을 점호로 인용하여 시스템의 깊이를 찾을 수 없게 하면 그는 그곳에서 빈 문자열로 대체할 수 있다는 것을 알아야 한다. 뚜렷한 이상을 일으키지 않았지만 이미 오류가 있었다

좋은 웹페이지 즐겨찾기