고급 템플릿
이 장에서 Django 템플릿 시스템의 내포를 깊이 연구했다.그것은 시스템을 확장할 계획이나 작업 원리에 대해 궁금해만 한다면 알아야 할 내용을 포함한다.Django를 계속 사용할 때 보안 조치에 의심할 여지가 없는 자동 전환 기능도 포함됩니다.
템플릿 언어 검토
먼저 3장에서 설명한 몇 가지 용어를 살펴보겠습니다.
{% if is_logged_in %}
Thanks for logging in!
{% else %}
Please log in.
{% endif %}
변수는 출력 값의 템플릿에 있는 기호입니다.가변 탭이 {{and}}에 의해 포위됨:
My first name is {{ first_name }}. My last name is {{ last_name }}.
이러한 용어에 대한 기본 지식에 대한 자세한 내용은 3장을 참조하십시오.이 장의 나머지 부분에서는 템플릿 엔진을 확장하는 방법을 토론한다.우선, 간단하게 보기 위해서, 우리는 3장의 일부 내부 부분을 빠르게 훑어보았다.
RequestContext 및 컨텍스트 프로세서
템플릿을 렌더링하려면 컨텍스트가 필요합니다.이것은django일 수 있습니다.template.Context의 실례이지만 Django도 하위 클래스인 django를 가지고 있습니다.template.동작이 약간 다른 RequestContext
RequestContext는 기본적으로 HttpRequest 객체 또는 현재 로그인한 사용자의 정보와 같은 템플릿 컨텍스트에 변수를 추가합니다.
render () 단축키는 다른 상하문 실례를 명확하게 전달하지 않는 한 RequestContext를 만듭니다.예를 들어,
from django.template import loader, Context
def view_1(request):
# ...
t = loader.get_template('template1.html')
c = Context({
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR'],
'message': 'I am view 1.'
})
return t.render(c)
def view_2(request):
# ...
t = loader.get_template('template2.html')
c = Context({
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR'],
'message': 'I am the second view.'
})
return t.render(c)
(이 예시들에서render() 단축키를 일부러 사용하지 않았습니다. - 우리는 수동으로 템플릿을 불러오고 상하문 대상을 구축하고 템플릿을 보여주고 있습니다. 저는 모든 절차를 명확하게 맞추고 있습니다.)
보기마다 같은 세 가지 변수--app,user,ipaddress - 템플릿에 전달됩니다.만약 우리가 쓸데없는 것을 삭제할 수 있다면, 좋지 않겠습니까?이 문제를 해결하기 위해 RequestContext와 상하문 프로세서를 만듭니다.상하문 프로세서에서 변수를 지정할 수 있습니다. 이 변수는 상하문에서 자동으로 설정되며, 각render () 호출에서 변수를 지정할 필요가 없습니다.
문제는 템플릿을 렌더링할 때 Context 대신 RequestContext를 사용해야 한다는 점입니다.컨텍스트 프로세서를 사용하는 가장 낮은 방법은 일부 프로세서를 만들어 RequestContext에 전달하는 것입니다.위의 예는 컨텍스트 프로세서를 사용하여 작성할 수 있습니다.
from django.template import loader, RequestContext
def custom_proc(request):
# A context processor that provides 'app', 'user' and 'ip_address'.
return {
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR']
}
def view_1(request):
# ...
t = loader.get_template('template1.html')
c = RequestContext(request,
{'message': 'I am view 1.'},
processors=[custom_proc])
return t.render(c)
def view_2(request):
# ...
t = loader.get_template('template2.html')
c = RequestContext(request,
{'message': 'I am the second view.'},
processors=[custom_proc])
return t.render(c)
이 코드를 살펴보겠습니다.
상하문 프로세서의 저급한 작업을 보여주기 위해서, 위의 예는render () 를 사용하지 않았습니다.그러나 가능한 것은 - 취할 수 있는 것이다 - 렌더 ()를 통해 상하문 프로세서를 사용합니다.context 사용instance 매개 변수는 다음과 같이 이 작업을 수행합니다.
from django.shortcuts import render
from django.template import RequestContext
def custom_proc(request):
# A context processor that provides 'app', 'user' and 'ip_address'.
return {
'app': 'My app',
'user': request.user,
'ip_address': request.META['REMOTE_ADDR']
}
def view_1(request):
# ...
return render(request, 'template1.html',
{'message': 'I am view 1.'},
context_instance=RequestContext(
request, processors=[custom_proc]
)
)
def view_2(request):
# ...
return render(request, 'template2.html',
{'message': 'I am the second view.'},
context_instance=RequestContext(
request, processors=[custom_proc]
)
)
여기에서, 우리는 모든 보기의 템플릿 렌더링 코드를 하나의 (포장) 선으로 잘랐다.이것은 개선이지만, 이 코드의 간결성을 평가하기 위해서, 우리는 우리가 지금 거의 과잉되어 있다는 것을 인정해야만 한다.우리는 코드에 군더더기 (프로세서 호출 중) 를 추가하는 대가로 군더기 데이터 (템플릿 변수) 를 삭제했다.
항상 프로세서를 입력해야 한다면, 상하문 프로세서를 사용하면 타자 시간을 많이 절약할 수 없습니다.이 때문에 Django는 전역 상하문 프로세서에 대한 지원을 제공합니다.context_processors 설정 (settings.py에서) 은 항상 RequestContext에 적용할 상하문 프로세서를 지정합니다.이렇게 하면 RequestContext를 사용할 때마다 프로세서를 지정해야 하는 경우가 없어집니다.
기본적으로 contextprocessors가 다음과 같이 설정됩니다.
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
이 설정은 우리 위의custom 을 사용합니다proc 함수와 같은 인터페이스의 호출 가능한 목록 - 요청 대상을 매개 변수로 하는 함수로 위아래 문장에 통합할 항목 사전을 되돌려줍니다.참고, context프로세스ors의 값이 문자열로 지정되었습니다. 이것은 프로세서가 Python 경로의 어딘가에 있어야 한다는 것을 의미합니다. (설정에서 인용할 수 있습니다.)
각 프로세서는 순서대로 적용됩니다.즉, 프로세서가 컨텍스트에 변수를 추가하고 두 번째 프로세서가 같은 이름의 변수를 추가하면 두 번째 프로세서가 첫 번째 프로세서를 덮어씁니다.Django는 기본적으로 활성화된 프로세서를 포함하여 여러 가지 간단한 컨텍스트 프로세서를 제공합니다.
AUTH
django.contrib.auth.context_processors.auth
이 프로세서가 활성화되어 있으면 각 RequestContext에 다음과 같은 변수가 포함됩니다.
DEBUG
django.template.context_processors.debug
프로세서가 활성화되어 있으면 각 RequestContext에는 두 변수가 포함됩니다. 그러나 DEBUG 설정이 True로 설정되어 있고 요청한 IP 주소(request.META ['REMOTE ADR'])만 INTERNALIPS 설정 시:
국제화
django.template.context_processors.i18n
이 프로세서를 활성화하면 각 RequestContext에는 다음과 같은 두 변수가 포함됩니다.
매스컴
django.template.context_processors.media
이 프로세서를 활성화하면 각 RequestContext에 MEDIA 변수가 포함됩니다.URL, MEDIA 제공URL 설정의 값입니다.
정적
django.template.context_processors.static
이 프로세서가 활성화되어 있으면 각 RequestContext에 변수 STATIC 가 포함됩니다.URL, 제공 STATICURL 설정의 값입니다.
CSRF
django.template.context_processors.csrf
이 프로세서에 csrf 가 추가되었습니다.Token 템플릿 라벨에 필요한 표시로 크로스오버 요청의 위조를 보호합니다. (19장 참조)
청원
django.template.context_processors.request
이 프로세서를 사용하면 각 RequestContext에는 현재 HttpRequest인 변수 요청이 포함됩니다.
기별
django.contrib.messages.context_processors.messages
이 프로세서를 활성화하면 각 RequestContext에는 다음과 같은 두 변수가 포함됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.