django 맛보기

hyuckhoon.ko·2020년 6월 10일
0

What I learned in wecode

목록 보기
47/109

위코드에서 제공한 django 기본 예제 진행(레플릿 클라우드 IDE환경)



views.py

1) 뷰 (views.py)란?

정의 : 특정 URL에 대한 파이썬의 콜백 함수를 의미한다.

클라이언트의 Request(요청)과 서버의 Response(응답)
웹 어플리케이션의 통신 골격이다.

이러한 웹들을 개발하기 위해
개발자들에게 개발 편의를 제공해주는 웹 프레임워크인 django(장고)역시 Request/Response 구조는 필수불가결한 개념이다.

클라이언트의 특정 Request와 그에 대응하는 서버의 Response를 위해

로직(논리)을 구현해 주는 파이썬 모듈이다.

(중요한 점은, 장고 공식문서에도 나와있는 내용이지만
단지 view("보여주다")의 의미로 해석되어 Front-end 적인 요소 및 클라이언트가 바라보는 단말기의 '화면'을 구현하는 것이라고 해석해서는 안된다는 점이다.)

'화면'보다는 로직과 데이터에 초점을 맞춰야 하며,
'어떤 데이터를 보고싶니?'
'어떤 데이터가 필요하니?'
와 같은 관점으로 뷰 모듈을 정의해야 한다.




아래의 예제를 보자.

2) views.py

import json
from django.views import View
from django.http  import JsonResponse


class MainView(View):
    def get(self, request):
		    return JsonResponse({"Hello":"World"}, status=200)

여기서는 간단한 구조를 가볍게 짚고 넘어가자.

  1. 패키지 및 모듈 (from, import) 이 보이고
  2. 클래스가 보인다.

깃허브에서 django 패키지를 검색해보자. (아래 그림 참조)

장고 패키지를 구성하는 여러 디렉토리들 파이썬 모듈이 보인다.

필요한 기능(변수, 함수, 클래스)을 개발 중인 모듈에서 사용하기 위해
from, import syntax를 통해 접근할 수 있다.



이번엔 클래스 정의를 보자.

class MainView(View):
    def get(self, request):
		    return JsonResponse({"Hello":"World"}, status=200)

MainView라는 이름의 클래스가 정의되어 있다.

MainView클래스는 View 클래스를 상속받는 구조다.
그리하여 View 내부의 변수, 함수 등을 (우리가 직접 작성하지 않아도)
바로 사용(접근)할 수가 있다.

이는 아래와 같이 선언된 코드 덕분이다.

from django.views import View

장고 패키지를 다운받아 사용하고 있는 우리는!
장고에 이미 내장된 클래스를 가져다 사용하기만 하면 된다.
(단, (너무나 당연한 얘기지만)그것이 어떤 의미인지는 알고 사용해야 한다.)



정말로 장고 패키지 내에 View 클래스가 있는지, 그리고 어떻게 작성되었는지 직접 확인해보자.

깃허브에서 django 패키지 디렉토리를 위와 같이 (경로를) 탐색해다.

또한, 위 그림과 같이 View 클래스가 정의되어 있음을 확인할 수 있다.


현재 진행하고 있는 레플릿 장고 예제 문제에서는 MainView클래스가 View 클래스를 상속받는 구조지만, 현재 views.py에서 장고 패키지의 내장 클래스를 사용하지 않고 ``return``만 하고 있다.

그래서 View 부분을 지우고 진행해도 되지 않느냐라고 말하는 사람들을 위해,

이제 곧 보게 될 urls.py에서 사용하니 걱정하지 않아도 된다ㅎㅎㅎㅎ

def get(self, request):
		    return JsonResponse({"Hello":"World"}, status=200)

장고 내장 클래스 View에 대한 자세한 얘기는 앞으로 할
수많은 프로젝트들을 진행하며 서술해 나가겠다.




추가로,
MainView 클래스 내부의 get메소드 역시
사실은 장고 패키지에 이미 내장되어 있다.
그러니 위 예제문제처럼 직접 우리가 정의할 필요는 없다.

 def get(self, header, alternate=None):
        return self._headers.get(header.lower(), (None, alternate))[1]



이번엔 return 문에 있었던 JsonResponse를 살펴보자.

장고 패키지 내부를 들여다보면 아래와 같다.
주석 처리된 부분을 보면

class JsonResponse(HttpResponse):
    """
    An HTTP response class that consumes data to be serialized to JSON.
    :param data: Data to be dumped into json. By default only ``dict`` objects
      are allowed to be passed due to a security flaw before EcmaScript 5. See
      the ``safe`` parameter for more information.
    :param encoder: Should be a json encoder class. Defaults to
      ``django.core.serializers.json.DjangoJSONEncoder``.
    :param safe: Controls if only ``dict`` objects may be serialized. Defaults
      to ``True``.
    :param json_dumps_params: A dictionary of kwargs passed to json.dumps().
    """

    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
                 json_dumps_params=None, **kwargs):
        if safe and not isinstance(data, dict):
            raise TypeError(
                'In order to allow non-dict objects to be serialized set the '
                'safe parameter to False.'
            )
        if json_dumps_params is None:
            json_dumps_params = {}
        kwargs.setdefault('content_type', 'application/json')
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super().__init__(content=data, **kwargs)

1. 매개변수(param)은 반드시 "to be dumped into json"이라고 돼 있다.

우리가 하는 예제는 {"Hello" : "World"}지만 좀 더 확장해서
{"Hello" : "World", "My name is " : "HOON", "My major is" : "Automotive engineering"}이라고 작성되도 문제가 없다는 말이다.

2. 두 번째 매개변수는 encoder=DjangoJsonEncoder로 디폴트 인자로 되어 있다.

3. 세 번째 매개변수는 safe=True로 역시 디폴트 변수로 돼 있다.

safe=True를 권장하고 있는데, dict객체가 직렬 구성일 경우에 True로 지정하라고 한다. 만일 non-dict 타입이라면 False로 변경시키라는 의미다.

4. 마지막 매개변수는 json_dumps_params로써,

**kwargs(가변 키워드 인자)형태로 받고 있다.


코드 아래 부분을 보면
if json_dumps_params is None:
    json_dumps_params = {}
kwargs.setdefault('content_type', 'application/json')
data = json.dumps(data, cls=encoder, **json_dumps_params)
super().__init__(content=data, **kwargs)

딕셔너리의 'key'와 'value'에 대한 데이터를 정의하고 있고
data 변수를 json.dumps를 통해 다시 가공하고 있다.
그리고 부모 클래스를 __init__을 통해 초기화 시키고 있다.


부모 클래스는 HttpResponse 였다.

class JsonResponse(HttpResponse):

                                     - One step at a time - 

0개의 댓글