웹프로그래밍/Django

[Django] HttpRequest, HttpResponse

ssung.k 2019. 8. 8. 20:07

HttpRequest

클라이언트로 부터 들어오는 모든 요청을 담고 있습니다. 일반적으로 클라이언트는 웹브라우저를 말하며 django restful API 로 안드로이드 등 앱과 연결 시킬 경우에는 클라이언트가 바뀔 수도 있겠죠.

request 에 접근

views 에서 함수를 정의할 때 아무렇지 않게 인자로 넘겨 주었던 request 가 바로 HttpRequest 의 객체입니다. 따라서 FBV 에서는 request 로 접근하고 CBV 에서는 self.request 로 접근을 하게 됩니다.

request 속성
  • method

    request 요청의 종류를 나타냅니다. "GET" 또는 "POST" 로서 대문자로 저장이 됩니다. 다음과 같은 분기문을 통해서 들어온 요청에 종류에 따라서 다른 작업을 수행할 수 있습니다.

    def post_create(request):
      if request.method == "POST":
        # 생략
      else if request.method == "GET":
        # 생략
    
  • GET

    GET 인자 목록에 접근 할 수 있습니다. 자료형은 QueryDict 입니다.

    QueryDict 란?

    python의 dict 과 유사한 자료형으로서 차이는 dict 은 Key 값이 중복 안되는데 비해 querydict 은 중복을 허용합니다.

  • POST

    POST 인자 목록에 접근 할 수 있습니다. 마찬가지로 자료형은 QueryDict 입니다. 이 때 file 에 대해서는 접근할 수 없습니다.

  • FILES

    POST 인자 중 파일에 한해서 접근이 가능합니다.

 

HttpResponse

html 파일, 이미지 등 다양한 응답을 해줄 수 있습니다. 그리고 FBV 기준으로 HttpResponse 가 없다면 오류를 발생합니다. 하나의 함수는 최소 하나의 HttpResponse 을 반환해야합니다. 이는 views 에서 검사하는게 아니라 middleware 에서 검사를 하게 됩니다.

# config/settings.py

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',
]

middleware 는 다음과 같이 app을 감싸고 있으면서 request 가 들어올 때는 적절하게 가공해주고 response 가 나갈 때도 확인을 해줍니다. 여러 middlewareHttpResponse 의 반환 유무를 확인해주는 것도 있습니다.

예시

HttpResponse 는 다음과 같이 사용합니다.

# 방법 1
response = HttpResponse(
	"<div>Hello World!</div>"
)
# 방법 2
response = HttpResponse()
response.write("<div>Hello World!</div>")