[Django] 요청에서 응답 프로세스 살펴보기

reowjd·2021년 1월 6일
1

Django 시리즈

목록 보기
1/5
post-thumbnail

요청에서 응답까지

장고에서 요청을 받고 응답하기까지의 프로세스를 살펴보자.
아래 이미지는 프로세스를 도식화했다.
django_cycle


요청을 받으면 가장 먼저 웹 애플리케이션 서버인 wsgi 서버를 만난다.

1. WSGI

WSGI는 웹 서버(apache, nginx)와 장고 프로젝트 간의 중계 역할을 한다. 웹 서버에서의 명령을 프레임워크가 이해할 수 없으니 그 사이를 메꿔주는 역할을 하는 것이다. gunicornuWSGI가 wsgi 서버들이다. wsgi 서버에서 요청을 처리하기 위해 애플리케이션을 실행하고, 애플리케이션이 처리한 응답을 반환하는 역할을 한다.

wsgi 서버는 보통 운영에서 사용되며 개발할 때는 runserver 명령어로 대신한다. 장고 내장 서버 (runserver)는 단일 프로세스를 사용하기 때문에 운영보다는 디버깅에 적합하다. 운영에서는 멀티프로세싱이 가능한 gunicorn이나 uWSGI등을 사용하여 많은 트래픽을 처리할 수 있도록 한다.

2. Middleware

Middleware는 뷰에서 요청 받기 전, 사용자에게 응답을 넘기기 전 등에 호출되어 다양하게 사용된다. 미들웨어를 활성화하기 위해서는 settings.pyMIDDLEWARE를 추가한다. 아래는 예시 값이다.

#공식 문서 참고
#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
    - 응답 객체에 render 메서드가 있는 경우에 호출되는 메서드

  • process_response
    - 뷰에서 반환된 객체를 응답하기 전에 호출되는 메서드

3. View

요청을 처리하고 응답 객체HttpRequest를 반환하는 것은 뷰이다. 뷰에서 DB를 읽거나 하여 요청에 필요한 처리를 한다. 템플릿을 반환하는 경우 아래처럼 render()를 포함하여 응답한다.

...
return HttpResponse(template.render(context, request))

4. Template

템플릿은 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
    -템플릿 엔진 API 지정.
    • 기본 옵션으로는 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

profile
개발계발

1개의 댓글