Django - HttpRequest, HttpResponse, Render, JsonResponse

Joey Lee·2020년 5월 19일
6

Django

목록 보기
6/23

이 내용은 장고 Request and response objects 공식문서를 요약/정리한 내용입니다.

1. Overview

장고는 request와 response 객체로 상태를 서버와 클라이언트가 주고 받습니다. 이를 위해 장고는 django.http 모듈에서 HttpRequest와 HttpResponse API를 제공합니다.

서버-클라이언트 통신 시 아래와 같은 절차로 데이터가 오고 갑니다.

1) 특정 페이지가 요청(리퀘스트)되면, 장고는 요청 시 메타데이터를 포함하는 HttpRequest 객체를 생성
2) 장고는 urls.py에서 정의한 특정 View 클래스/함수에 첫 번째 인자로 해당 객체(request)를 전달
3) 해당 View는 결과값을 HttpResponse 혹은 JsonResponse 객체에 담아 전달

2. HttpRequest 객체

1) 주요 속성(Attribute)

HttpRequest.body  # request의 body 객체
HttpRequest.headers # request의 headers 객체
HttpRequest.COOKIES # 모든 쿠키를 담고 있는 딕셔너리 객체
HttpRequest.method # reqeust의 메소드 타입
HttpRequest.GET # GET 파라미터를 담고 있는 딕셔너리 같은 객체
HTTpRequest.POST # POST 파라미터를 담고 있는 딕셔너리 같은 객체

사용 사례

  • request.method
if request.method == 'GET':
    do_something()
elif request.method == 'POST':
    do_something_else()
  • request.headers 가져오기
{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6', ...}

>>> 'User-Agent' in request.headers
True
>>> 'user-agent' in request.headers
True

>>> request.headers['User-Agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers['user-agent']
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

>>> request.headers.get('User-Agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)
>>> request.headers.get('user-agent')
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6)

2) 주요 메소드(Methods)

HttpRequest.read
HttpRequest.get_host()
HttpRequest.get_port()

3. HttpResponse

HttpResponse(data, content_type)
  • response를 반환하는 가장 기본적인 함수
  • 주로 html를 반환
# string 전달하기
HttpResponse("Here's the text of the Web page.")

# html 태그 전달하기
response = HttpResponse()
>>> response.write("<p>Here's the text of the Web page.</p>")

4. HttpRedirect

HttpResponseRedirect(url)
  • 별다른 response를 하지는 않고, 지정된 url페이지로 redicrect를 함
  • 첫번 째 인자로 url를 반드시 지정해야 하며, 경로는 절대경로 혹은 상대경로를 이용할 수 있음

5. Render

render(request(필수), template_name(필수), 
      context=None, content_type=None, 
      status=None, using=None)
  • renderhttpRespose 객체를 반환하는 함수로 template을 context와 엮어 httpResponse로 쉽게 반환해 주는 함수임
  • template_name에는 불러오고 싶은 템플릿명을 적음
  • context에는 View에서 사용하던 변수(dictionary 자료형)를 html 템플릿에서 전달하는 역할을 함. key 값이 템플릿에서 사용할 변수이름, value값이 파이썬 변수가 됨
# views.py

from django.shortcuts import render

def my_view(request):
    name = "joey"
    return render(request, 'app/index.html', {
        'name': name,
    }

5. JsonResponse

JsonResponse(data, encoder=DjangoJSONEncoder,
             safe=True, json_dumps_params=None, 
             **kwargs)
  • HttpResponse의 subclass로, JSON-encoded response를 생성할수 있게 해 줌. 대부분의 기능은 superclass에서 상속받음
  • 첫번째 인자로는 전달할 데이터로서 반드시 dictionary 객체여야 함.
  • 디폴트 Content-type 헤더는 application/json
  • encoder는 데이터를 serialize할 때 이용됨.
  • json_dumps_paramsjson.dumps()에 전달할 딕셔너리의 keyword arguments임
# Serializing non-dictionary objects
response = JsonResponse([1, 2, 3], safe=False)

JsonResponse는 response를 커스터마이징 하여 전달하고 싶을때, http status code에 더하여 메세지를 입력해서 전달할 수 있다.

이 메세지는 프론트엔드 개발자와 협의하여 약속된 메시지를 던진다. 만약 딱히 전달할 메시지가 없고, status code만 전달한다면 HttpResponse를 사용하면 된다.

메세지를 입력할 때는 보안 이슈가 있기 때문에 너무 자세히 적지 않는 것이 좋다.

profile
안녕하세요!

2개의 댓글

comment-user-thumbnail
2021년 7월 9일

감사합니다.
잘 보고 가요.

답글 달기
comment-user-thumbnail
2021년 9월 23일

감사합니다. 잘 보고 갑니다.

답글 달기