백엔드의 주요한 역할, 웹브라우저를 구성하는데 필요한 데이터를 잘 주고받을 수 있도록 하는 것!
java에서 DAO에 담아서 사용하였다면, dJango/python에서는 views.py를 통해 로직을 작성해서 주고받는다.
지금까지 접한 아이들의 대략적인 역할은?
models.py
: DB와 소통하기 위한 파일
테이블 생성, 추가, 삭제 등의 관리를 할 수 있다.urls.py
: 경로를 설정해주는 파일
웹 브라우저 내에서 접속할 경로를 설정한다.
application, 최상위 프로젝트의 작업 경로를 지정해줄 수 있다.views.py
: 기능 구현을 위한 로직을 작성하는 파일
내가 처리하고 싶은 로직을 해당 파일 내에 메서드를 선언해서 작업한다.
get()
,post
,put
,delete
manage.py
: 사이트 관리를 도와주는 스크립트
다른 설치 작업 없이 웹 서버를 구동할 수 있다
migrate 작동도 함!settings.py
: 웹사이트 설정이 있는 파일
해당 파일 내에 웹 프로젝트 관련 설정을 할 수 있다
DB연동, 접근허용하는 ip 주소, 등..
conda -n
conda activate
pip install django
pip install mysqlclient
app 생성하고 파이썬 파일들을 수정해주자 (안하면 에러남!)
./manage.py startapp user
views.py(동작에 대한 것 담당)
class Category(models.Model):
name = models.CharField(max_length=20)
class Meta:
db_table = 'categories'
Q. Meta 클래스 정보를 주는 이유는?
- 지금까지는,
application명 + models.py 내 작성한 클래스명
으로 테이블 이름이 자동으로 생성되었는데,
위와 같이 Meta 클래스 정보를 주면 내가 설정한 이름으로 테이블을 생성할 수 있기 때문!
1 import json
2 from django.views import View
3 from django.views import JsonResponse
getAll()
메서드를 사용하면 딕셔너리 형태로와서 바로 쓸 수 있어서 편하지만,all()
메서드를 사용한 뒤, response
구간에서 자료구조를 바꾸어 주도록 하자! import json
from django.http import JsonResponse
from django.views import View
from products.models import Category, Drinks
# Create your views here.
class CategoryView(View):
def get(self, request):
categories_data = Category.objects.all()
categories = []
# Drinks_data = Drinks.objects.all()
for i in categories_data:
categories.append({
"name" : i.name,
"menu_id": i.menu_id
})
print(categories)
우선은 print만 사용해서 값이 넘어오는지 확인해보기!
from django.urls import path
from products.views import CategoryView
urlpatterns = [
path('/category', CategoryView.as_view()),
]
우선, 내가 작업하고있는 application의 경로를 잡아주기!
url 규칙을 지키면서 작성해주는게 편하다.
주소의 가장 마지막이 될 곳에는 slash 금지..!
#from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('products', include('products.urls')),
]
이제 최상위 프로젝트 폴더 내의 urls.py에서 경로 잡아주기
해당 urls.py에 적힌 경로는 가장 최상위 경로이기 때문에, slash 를 붙여주지 않는다.
혹시라도 slash를 붙여줄 경우, 하위 경로의 slash와 중첩되어 경로 오류가 나기 때문이다
products/views.py 내 print()
함수만 작성해두었기 때문에
httpie 상에서는 에러가 뜨지만, 내 콘솔에는 가져온 값이 dictionary 형태로 보인다
from products.models import Category, Drinks
# Create your views here.
class CategoryView(View):
# 가져오는 것
def get(self, request):
categories_data = Category.objects.all()
categories = []
# Drinks_data = Drinks.objects.all()
for i in categories_data:
categories.append({
"name" : i.name,
"menu_id": i.menu_id
})
return JsonResponse({'data':categories}, status=200)
이제 리턴값, 메세지를 주고, 다시 시도를 해 보면
httpie 상으로 출력되는 데이터를 확인할 수 있다. 👆🏻👆🏻
models.py는 위와 동일한 조건에서 진행!
우리에게 중요한건 views.py 내 로직이니까 ><
# 입력받는 것
def post(self, request):
data = json.loads(request.body)
print(data)
우선 views.py 내 http에게서 입력받은 json 데이터를 출력하는 post 메서드 관련 로직을 작성한 뒤
httpie로 데이터를 넘기면서 테스트해보자!
콘솔을 확인해보니, 넘어오는 데이터는 있는데
관련 POST 처리 로직이 없으므로 500에러가 나는 상황!
# 입력받는 것
def post(self, request):
data = json.loads(request.body)
Category.objects.create(name=data['name'], menu_id=data['menu_id'])
return JsonResponse({'message' : 'SUCCESS'},status=200)
이제 진짜로 POST 처리 로직을 적어보자
물론 나중에는 try, catch, exception 다 작성 해주어야하는데 우선 간략하게 테스트!
입력한 값이 무사히 잘 넘어가는 것을 확인할 수 있다.
DB 확인해보면 무사히 넘겨받은 값이 insert 되어있는 것을 확인할 수 이쎠!!! ><