<Django> Django C.R.U.D(2)

jm_yoon·2020년 12월 29일
1
post-thumbnail

(1)에서는 Model(models.py)을 작성하고 model.objects의 method를 통해서 Database와 통신하는 방법과 QuerySet API가 제공하는 메서드를 활용하여 데이터베이스에 데이터를 생성/조회/수정/삭제 작업을 알아보았다.

이번 포스팅에서는 HTTP 통신을 통해 Client(chrome, postman, httpie)를 사용해서 직접 Server에 요청을 보내서 Django로 작성한 application code를 실행하여 데이터베이스에서 데이터를 불러오고, 생성하고, 수정하고, 삭제하는 작업을 정리해 보았다.

다시 정리하자면, Client의 HTTP 요청(https://127.0.0.1/products)을 분석(urls.py)하여 요청을 처리하기 위한 로직(views.py)을 실행시켜, 데이터베이스와 통신(models.py)하여 데이터 작업을 수행하고 요청에 맞는 HTTP 응답을 Client에게 보내줄 수 있는 Backend API를 구현하는 방법을 정리해 보았다.

먼저 cors에 대한 처리를 원할하게 도와줄 플러그인인 django-cors-headers를 설치해준다.
$ pip install django-cors-headers(for mac)

MySQL 준비

다른 터미널창에서 데이터베이스르르 새로 생성하거나 연결할 데이터베이스명 확인하기

settings.py 설정하기

ALLOWED_HOSTS = ['*'] # IP 허용

INSTALLED_APPS = [
...
		'django.contrib.staticfiles',
		'products', # 생성한 앱
		'corsheaders' # 추가해주기
]

MIDDLEWARE = [
	...
		'corsheaders.middleware.CorsMiddleware',
        # csrf 주석처리
	...
]

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'DATABASE 명',
        'USER': 'DB접속 계정명',
        'PASSWORD': 'DB접속용 비밀번호',
        'HOST': '실제 DB 주소',
        'PORT': '포트번호',
    }
}

APPEND_SLASH = False다음줄에 허용할 값을 정의 해준다.

#REMOVE_APPEND_SLASH_WARNING
APPEND_SLASH = False

##CORS
CORS_ORIGIN_ALLOW_ALL=True
CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
)

CORS_ALLOW_HEADERS = (
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
		#만약 허용해야할 추가적인 헤더키가 있다면?(사용자정의 키) 여기에 추가하면 됩니다.
)

products/models.py 작성

Django C.R.U.D (1) 세션에서 작성한 models.py를 사용한다.

Client 준비

Server에 HTTP request를 전송할 수 있는 client 중에 하나인 Httpie 설치

$ sudo apt install httpie #Ubuntu
$ brew install httpie #Mac

http 요청 보내기

$ http -v POST 127.0.0.1:8000/product menu='음료' category='콜드브루' 
product:='{"name":"맛있는 콜드브루", "price":5400}'

다음과 같이 요청을 보내면 요청을 받아줄 서버가 아직 없기 때문에 connectionError가 발생한다.

http메소드 - POST

Create

자원(resource)를 생성할 때, http method 중에 post method를 사용한다. 또한 로그인 회원가입 등 중요한 정보도 POST method로 데이터를 request의 body에 담아서 client에서 server로 요청한다.

products/views.py 작성

생성한 앱 이름/views.py 파일을 열어 작성해준다.

mport json
from django.http     import JsonResponse

from django.views    import View
from products.models import Menu, Category, Product

class ProductsView(View):

    def post(self, request):
		    data = json.loads(request.body)
        menu     = Menu.objects.create(name=data['menu'])
        category = Category.objects.create(
                name=data['category'],
                menu=menu
        )
        product = Product.objects.create(
                name=data['product']['name'],
                category=category
        )
        return JsonResponse({'MESSAGE':'SUCCESS'}, status=201)

urls.py 작성

프로젝트명/urls.py 작성(westarbucks/urls.py)
  from django.urls import path, include

  urlpatterns = [
      path('products', include('products.urls'))
  ]
앱이름/urls.py 작성 (products/urls.py)
from django.urls    import path
from products.views import ProductsView

urlpatterns = [
    path('', ProductsView.as_view())
]

httpie(client)로 server에 요청 보내기

manage.py가 있는 디렉토리로 이동한 후 python.manage.py runserver입력하고
client창으로 와서 요청 보내기

$ http -v POST 127.0.0.1:8000/product menu='음료' category='콜드브루' 
product:='{"name":"맛있는 콜드브루", "price":5400}'

http메소드 - GET

Read

자원(resource)를 읽어 올 때, http method 중에 GET method를 사용한다.

products/views.py 작성

def post함수밑에 def get함수 작성하기

def get(self, request):
        products = Product.objects.all()
        results = []
        for product in products:
            results.append(
              {
                  "menu":product.category.menu.name,
			      "category":product.category.name,
				  "product" :product.name
              }
        )
        return JsonResponse({'results':results}, status=200)

urls.py 작성

프로젝트명/urls.py 작성(westarbucks/urls.py)
from django.urls import path, include

urlpatterns = [
    path('products', include('products.urls'))
]
앱이름/urls.py 작성 (products/urls.py)
rom django.urls    import path
from products.views import ProductsView

urlpatterns = [
    path('', ProductsView.as_view())
]

httpie(client)로 server에 요청 보내기

manage.py가 있는 디렉토리로 이동한 후 python.manage.py runserver입력하고
client창으로 와서 요청 보내기
$ http -v GET 127.0.0.1:8000/products

profile
Hello!

0개의 댓글