C.R.U.D with Django 2 [Wecode][210820]

Jungsoo kim·2021년 8월 22일
0

wecode

목록 보기
14/30

지난번 글에 이어서 Django의 CRUD를 추가로 알아보려고 한다.

<목차>
1. Httpie 이란?
2. HTTP 통신 기반 Data flow
3. Post & Get Method
4. Views & Urls.py 작성

1. Httpie 이란?

Httpie는 python으로 개발된 http client 유틸리티이다. 설명이 어려운데 최대한 간단하게 설명하자면, CLI를 사용하여 http 통신으로 서버와 연결하여 작업이 가능하게 해주는 도구 정도로 정의하면 될 것 같다.

자세한 내용은 링크 Httpie를 방문하여 알아보면 될 것 같다.

Httpie의 장점

  • 요청과 응답이 어떻게 들어갔고 나왔는지를 확인하는 것이 가능하다.
  • Json 타입을 지원하는 기능이 내장되어 있다.
  • 출력을 포맷팅해서 보여줘서 가독성이 좋다.
  • Form과 file 업로드가 쉽다.

간단하게 설치 방법 및 사용 방법만 알아보고 넘어가자.

Httpie 설치 방법

$ brew install httpie

Httpie 사용 방법

$ http [flags] [METHOD] URL [ITEM [ITEM]]
  • flags : 실행시 전달할 옵션이다. -로 시작하며 -v, -a, -json 등이 있다.
  • Method : Http 메소드를 입력한다. 미입력시 Get 메소드로 받아들인다.
  • URL : 사용할 URL 입력

구체적인 사용 방법은 추후에 다른 글을 정리 할 때 알아보려고 하니 참고하기 바란다.

2. Http 통신 기반 Data flow

기본적인 Http 통신 기반 Data flow는 아래와 같다.

HTTP 통신을 통해 Client(chrome, postman, httpie)를 사용해서 직접 Server에 요청을 보내서 Django로 작성한 application code를 실행하여 데이터베이스에서 데이터를 불러오고, 생성하고, 수정하고, 삭제한다.
이를 그림으로 표현하면 아래와 같다.

덧붙여, 전반적인 장고 서버와 HTTP request & response의 flow를 설명하면 아래와 같다.

Client의 HTTP 요청(GET https://10.58.4.1/products)을 분석(urls.py)하여 요청을 처리하기 위한 로직(views.py)을 실행시켜, 데이터베이스와 통신(models.py)하여 데이터 작업을 수행하고 요청에 맞는 HTTP 응답을 Client에게 보내준다.

3. Post & Get Method

Httpie에 있어 가장 기본적이고 중요한 메소드인 Post와 Get을 알아보려고 한다.

Post 메소드는 데이터를 입력하고자 하는 요청이 들어왔을 경우, 입력된 데이터를 데이터베이스에 저장하게 하는 메소드이다.

Get 메소드는 현재 데이터베이스에 존재하는 데이터를 호출하고자 하는 요청이 들어왔을 경우 해당 데이터를 호출해주는 메소드이다.

백문이불여일견, 아래에 실제로 View.py를 작성하여 터미널에서 Post & Get 메소드를 사용하는 것을 해보려고 한다.

4. Views & Urls.py 작성

Post & Get 메소드를 사용하기 전에 내가 작성한 Views.py & Urls.py 코드는 아래와 같다.

# Views.py
from django.shortcuts import render

# Create your views here.

import json

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

from products.models import Owner, Dog

class SampleView(View):
    def post(self, request):
        data = json.loads(request.body)
        owner = Owner.objects.create(
            name=data['owner'],
            email=data['email'], 
            age=data['age'], 
        )

        return JsonResponse({'MESSAGE':'CREATED'}, status=201)

    def get(self, request):
        owners = Owner.objects.all()
        results = []
        for owner in owners:
            dog_list = []
            dog_infos = owner.dog_set.all()
            for dog_info in dog_infos:
                dog_list.append(
                    {
                        "dog_name" : dog_info.name,
                        "dog_age" : dog_info.age,
                    }
                )

            results.append(
                {
                    "owner_name" : owner.name, 
                    "email" : owner.email,
                    "owner_age" : owner.age,
                    "dog_information" : dog_list, 
                }
            )

        return JsonResponse({'results':results}, status=200)

class DogView(View):
    def post(self, request):
        data = json.loads(request.body)
        dog = Dog.objects.create(
            name=data['dog'],
            owner=Owner.objects.get(name=data['owner']),
            age=data['dog_age'],
        )

        return JsonResponse({'MESSAGE':'CREATED'}, status=201)

    def get(self, request):
        dogs = Dog.objects.all()
        results = []
        for dog in dogs:
            results.append(
                {
                    "dog_name" : dog.name,
                    "owner" : dog.owner.name, 
                    "dog_age" : dog.age
                }
            )
        return JsonResponse({'resutls':results}, status=200)
# Urls.py (main, 상위폴더에 있는 Urls.py)

from django.urls import path, include

urlpatterns = [
    path('products/', include('products.urls')),
]
# Urls.py (하위 앱폴더에 있는 Urls.py)

from django.urls import path

from products.views import SampleView
from products.views import DogView

urlpatterns = [
	path('', SampleView.as_view()),
    path('dog/', DogView.as_view()), 
]

Views.py, Urls.py 코드도 작성이 끝났으니 이제 실제로 Post & Get 메소드를 작동시켜 보려고 한다.

이미 기존에 저장되어 있는 데이터는 아래 사진과 같다.

여기에 한 명의 주인과 2마리의 개를 추가하려고 한다.

입력 코드는 아래와 같다.

$ http -v POST 127.0.0.1:8000/products/ owner='Obama' email='Obama2012@gmail.com' age=63

$ POST 127.0.0.1:8000/products/dog/ dog='Jindo' owner='Obama' dog_age=3

$ http -v POST 127.0.0.1:8000/products/dog/ dog='Sabsal' owner='Obama' dog_age=4

입력 코드의 결과는 아래 스크린 샷과 같으며, 마지막 사진과 같이 데이터가 잘 들어간 것을 확인할 수 있다.

마지막으로, Get 메소드를 사용하여 저장되어 있는 데이터를 출력해보려고 한다.

데이터를 가져오기 위한 코드는 아래와 같다.

# SampleView 사용하여 주인 정보 출력
$ http -v GET 127.0.0.1:8000/products/

# DogView 사용하여 개 정보 출력
$ http -v GET 127.0.0.1:8000/products/dog/

이 코드에 대한 출력 값은 아래와 같다.

SampleView를 사용하여 주인 데이터를 불러온 결과 값을 확인하면 주인이 갖고있는 강아지의 모든 데이터 정보가 이중으로 포함돼서 출력되는 것을 확인 할 수 있다. 이는 두 개의 데이터 주인 & 강아지가 One to Many 관계로 테이블이 작성되었기 때문에 가능한 표현이며, 이에 대해서는 나중에 따로 포스팅하려고 한다. (Many to Many 관계와 함께)

그럼 20,000~

profile
어렵지만 꾸준히 차근차근 해 나가자~!

0개의 댓글