장고에서 요청을 받고 응답하기까지의 프로세스를 살펴보자.
아래 이미지는 프로세스를 도식화했다.
요청을 받으면 가장 먼저 웹 애플리케이션 서버인 wsgi 서버를 만난다.
WSGI는 웹 서버(apache, nginx)와 장고 프로젝트 간의 중계 역할을 한다. 웹 서버에서의 명령을 프레임워크가 이해할 수 없으니 그 사이를 메꿔주는 역할을 하는 것이다. gunicorn
나 uWSGI
가 wsgi 서버들이다. wsgi 서버에서 요청을 처리하기 위해 애플리케이션을 실행하고, 애플리케이션이 처리한 응답을 반환하는 역할을 한다.
wsgi 서버는 보통 운영에서 사용되며 개발할 때는
runserver
명령어로 대신한다. 장고 내장 서버 (runserver
)는 단일 프로세스를 사용하기 때문에 운영보다는 디버깅에 적합하다. 운영에서는 멀티프로세싱이 가능한 gunicorn이나 uWSGI등을 사용하여 많은 트래픽을 처리할 수 있도록 한다.
Middleware는 뷰에서 요청 받기 전, 사용자에게 응답을 넘기기 전 등에 호출되어 다양하게 사용된다. 미들웨어를 활성화하기 위해서는 settings.py
에 MIDDLEWARE
를 추가한다. 아래는 예시 값이다.
#공식 문서 참고
#https://docs.djangoproject.com/en/3.1/topics/http/middleware/
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
요청이 발생하면, wsgi 핸들러는 settings.py
파일을 임포트하고 MIDDELWARE
를 찾아 모든 미들웨어 클래스를 로드한다.
미들웨어에서 다음과 같은 메서드 등을 사용할 수 있다.
process_request
process_request
응답 후, urls.py
에서 요청을 처리할 뷰를 찾는다.process_view
:views.py
)에 접근하기 전에 호출 되는 메서드(csrf확인 등)None
(뷰 호출) 또는 HttpResponse
(그대로 응답) 반환process_exception
process_view
에서 예외를 발생시키면 호출되는 메서드process_tempate_response
process_response
요청을 처리하고 응답 객체HttpRequest
를 반환하는 것은 뷰이다. 뷰에서 DB를 읽거나 하여 요청에 필요한 처리를 한다. 템플릿을 반환하는 경우 아래처럼 render()
를 포함하여 응답한다.
...
return HttpResponse(template.render(context, request))
템플릿은 html을 반환한다. 템플릿 경로는 settings.py
에서 아래와 같이 지정할 수 있다.
#공식 문서 참고
#https://docs.djangoproject.com/ko/3.1/topics/templates/
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# ... some options here ...
},
},
]
BACKEND
django.template.backends.django.DjangoTemplates
와 django.template.backends.jinja2.Jinja2
가 있음DIRS
: template 디렉토리 위치APP_DIRS
: 엔진이 설치된 애플리케이션 내에서 템플릿 소스 파일을 찾을지에 대한 여부마지막으로 미들웨어의 process_response
까지 호출하고 나면 응답을 반환한다.
요청부터 응답까지 프로세스를 간략하게 살펴 보았는데, 상세 내용은 시리즈로 계속 추가할 예정이다. 끝!
참고 : https://medium.com/@adamking0126/django-middlewares-and-the-request-response-cycle-fcbf8efb903f