Python/Django

[Django] context_processors 콘텍스트 프로세서

S0PH1A 2019. 1. 16. 23:00
반응형
[Django] context_processors


#Context_processor?
- templates에서 사용되는 변수들을 미리 정의하여, 중복 선언을 피하는 방법이다.
- 코드(프로세서 호출)에서 중복성을 추가하는 대신 데이터(템플릿 변수)에서 중복성을 제거한다. 
- RequestContext를 사용하여 템플릿을 랜더링 할 때, 사용자가 정의한 프로세서를 전달한다.
- RequestContextdml의 첫번째 인수는 HttpRequest객체, 즉, view뷰 함수로 전달된 객체 request가 돼야 하며, 두번째 인수는 선택적 프로세서 인수(함수의 목록 또는 튜플)을(를) 취한다.


Ex) 
View01 과 view02에서 app, user, ip-address 콘텍스트를 중복해서 사용되고 있다.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from django.http import HttpResponse
from django.template import loader, Context
from django.template import Template

# Create your views here.
def view01(request):
    t = Template('{{ app }}: {{ message }}')
    c = Context({
        "app": "My Main-App",
        "user": request.user,
        "ip-address": request.META["REMOTE_ADDR"],
        "message": "I am view01!"
    })
    return HttpResponse(t.render(c))

def view02(request):
    t = Template('{{ app }}: {{ message }}')
    c = Context({
        "app": "My Main-App",
        "user": request.user,
        "ip-address": request.META["REMOTE_ADDR"],
        "message": "I am view02!"
    })
    return HttpResponse(t.render(c))

Context Processor를 생성하고,
Context를 RequestContext로 변경하여 정의한 Context_processors를 사용한다.
아래에서 선택적 프로세서 인수로 튜플과 함수 모두 사용한다.
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from django.http import HttpResponse
from django.template import RequestContext
from django.template import Template

# Create your views here.

# context processor 추가
def contextProcessor(request):  # 함수 명은 사용자 임의로 사용 가능하다.
    return {
        "app": "My Main-App",
        "user": request.user,
        "ip-address": request.META["REMOTE_ADDR"],
    }

def view01(request):
    t = Template('{{ app }}: {{ message }}')
    c = RequestContext(request, {"message" : "I am view01!"}, [contextProcessor])
    return HttpResponse(t.render(c))

def view02(request):
    t = Template('{{ app }}: {{ message }}')
    c = RequestContext(request, {"message": "I am view02!"}, [contextProcessor])
    return HttpResponse(t.render(c))





반응형