(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)
다른 터미널창에서 데이터베이스르르 새로 생성하거나 연결할 데이터베이스명 확인하기
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',
#만약 허용해야할 추가적인 헤더키가 있다면?(사용자정의 키) 여기에 추가하면 됩니다.
)
Django C.R.U.D (1) 세션에서 작성한 models.py를 사용한다.
Server에 HTTP request를 전송할 수 있는 client 중에 하나인 Httpie 설치
$ sudo apt install httpie
#Ubuntu
$ brew install httpie
#Mac
$ http -v POST 127.0.0.1:8000/product menu='음료' category='콜드브루'
product:='{"name":"맛있는 콜드브루", "price":5400}'
다음과 같이 요청을 보내면 요청을 받아줄 서버가 아직 없기 때문에 connectionError가 발생한다.
자원(resource)를 생성할 때, http method 중에 post method를 사용한다. 또한 로그인 회원가입 등 중요한 정보도 POST method로 데이터를 request의 body에 담아서 client에서 server로 요청한다.
생성한 앱 이름/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)
from django.urls import path, include
urlpatterns = [
path('products', include('products.urls'))
]
from django.urls import path
from products.views import ProductsView
urlpatterns = [
path('', ProductsView.as_view())
]
manage.py가 있는 디렉토리로 이동한 후 python.manage.py runserver
입력하고
client창으로 와서 요청 보내기
$ http -v POST 127.0.0.1:8000/product menu='음료' category='콜드브루'
product:='{"name":"맛있는 콜드브루", "price":5400}'
자원(resource)를 읽어 올 때, http method 중에 GET method를 사용한다.
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)
from django.urls import path, include
urlpatterns = [
path('products', include('products.urls'))
]
rom django.urls import path
from products.views import ProductsView
urlpatterns = [
path('', ProductsView.as_view())
]
manage.py가 있는 디렉토리로 이동한 후 python.manage.py runserver
입력하고
client창으로 와서 요청 보내기
$ http -v GET 127.0.0.1:8000/products