Django - C.R.U.D (2)

LEE_JUN_HA·2021년 2월 2일
0

서버에 연동

서버는 계속 켜져있다
클라이언트에서 서버에 리퀘스트를 보낸다
리퀘스트 안에서 body를 잘 봐야한다.

터미널 3개 오픈(터미널, mysql, shell)


터미널에서 brew install httpie (이 창은 이제 runserver를 할 창이다) 후 conda activate

새로운 창 2개를 더 띄운다

mysql 1개(mysql -u root -p),
호스트?창 1개(conda activate를 해준다)

이렇게 되면 3개의 창 생성 완료.
(간편하게 1창을 runserver창, 2창을 mysql창, 3창을 호스트 창이라고 부르겠다)


1창에서 python manage.py runserver 실행
3창에서 http GET localhost:8000/ 입력(입력하면 http창이 촤라락 엄청 길게 뜬다 - 뜨는 거 확인하기)

vscode urls.py에서

path를 사진처럼 바꿔주기(위에 주석은 삭제해 주는 거 같은데 나는 일단 무서워서 나뒀다. products는 내가 만든 앱이 products이기 때문이다. 다른 이름으로 만들었으면 다른 걸로 넣어주자)

내가 만든 products 앱 안에 urls.py 파일을 생성

원래 starbucks94폴더를 생성했을 때부터 있었던 urls.py안에 있었던

(from부터 다 가져오기) 저 코드를 products 앱 안에 있는 urls.py에 그대로 복사해주기

(앞으로 starbucks94의 urls.py는 형 url이라 부르고, products 앱 안에 우리가 생성한 urls.py는 동생 url이라고 부르겠다)


형 url에

밑줄 친 include 추가해주기


views.py에서 from ~~~ render를 다 삭제하고,
from django.views import View를 입력

2줄 띄우고 class 선언 - class UserListview(View):
(클래스 이름(UserListView)은 클래스에 맞게 넣어주면 된다(나는 스타벅스여서 유저 리스트 뷰가 안 어울리지만 이름을 뭘로 할지 몰라 따라했다).
그리고 뒤에 파라미터 안에는 (View)가 왔는데 이는 import 뒤에 View 클래스가 와서 똑같이 넣어주면 된다.

✨ 클래스 안의 매소드가 작동되는 원리!

매소드로는 GET, POST, DELETE 등 올 수 있는데 이를 실행시키기 위해서는 def get(self): 처럼 작동시켜주면 된다!

셀프 뒤 request 추가


form django.views import View 밑에
JsonRnesponse(제이슨 리스폰스)를 import 해준다 (from django.http import JsonResponse)

✨JsonResponse가 뭔지 알아보자!

return JsonResponse() 뒤에 인자 값을 2개 받는데
return JsonResponse(a,b)라고 가정을 해보자
그럼 a는 보통 딕셔너리로 많이 받는데 이것은 일반적인 파이썬 언어이다.
이를 Json언어?로 바꿔줘야 프론트엔드가 데이터를 쓸 수 있기 때문에 JsonResponse로 변화시켜 줘야한다!


동생 url로 가서 밑줄 친 코드를 넣어준다.
밑의 path('', UserListView.as_view())에서 as.view는 어려울 수 있는 내용인데 view라는 만들어진 걸 가져오기 때문에 넣어준다.


다시 터미널로 가서 1창에서 python manage.py runserver가 켜졌는지 다시 확인 후

3창에서 http GET localhost:8000/products 를 쳐서 "message": "Hello Django!"가 나오면 성공!


이제는 새롭게 starbucks94의 내용을 가지고 와 보자!
views.py에 가서

imprt할 클레스를 넣어주고, 위의 코드를 넣는다.
(코드는 하나하나 어떤 동작을 하는지 자세히 살펴 보자)

3창에서 http GET localhost:8000/products 를 쳐서

{
    "results": [
        {
            "category_id": 1,
            "descriPption": "부드러운 목넘김",
            "english_name": "Nitro Vanilla Cream",
            "id": 1,
            "korean_name": "나이트로 바닐라 크림"
        },
        {
            "category_id": 1,
            "description": "동남아 휴가지",
            "english_name": "Dolce Cold Brew",
            "id": 2,
            "korean_name": "돌체 콜드 브루"
        }
    ]
}

이렇게 나오면 성공!

POST

클레스 네임을 주의하면서 제일 밑 def post 코드를 다 view.py에 입력한다

3창으로 가서 http POST localhost:8000/products를 하면
"message":"hello django! - POST"가 떠야한다.


post 순서

step 1. request.body 에 담겨 있는 JSON 데이터를 꺼낸다.
step 2. JSON -> python
step 3. CREATE
step 4. Response 를 뿌려준다


view.py에서

print(request.body)를 입력 후

터미널 3창에서 http POST localhost:8000/products message="Hello", number=10을 입력하면

1창에서 b'{"message": "Hello", "number": "10"}'가 떠야한다.

이건 단순히 프린트를 해보는 것으로, b(바이트)형태로 인코딩 돼서 우리가 넣은 메세지가 제대로 출력되는지 확인해 보는 과정이다.

여기서 보면 스트링으로 전송이 됐는데 제이슨은 기본적으로 스트링이다.


step 1 + step 2:

view.py 제일 위에

improt json을 넣어준다.
(이건 장고랑 상관 없이 파이썬 내장모듈이기 때문에 from 없이 바로 쓸 수 있다. 넣어주는 이유는 제이슨 데이터를 핸들링할 수 있는 메소드가 담겨있는 모듈이기 때문에 이걸 사용해서 파이썬으로 변환할 수 있다.)

def post(self, request): 함수 안에(들여쓰기 하라는 뜻)

data = json.loads(request.body)를 넣어준다. (loads를 불러서 request.body를 쌩으로 넣어버린다)

위가 작동이 되는지 궁금하면

print(data)를 찍고

3창으로 넘어가서 다시 http POST localhost:8000/products message="Hello", number=10를 입력해 1창을 확인해 본다.

처음과 다른 점은 b(바이트)가 사라지고 딕셔너리만 남았다.

딕셔너리만 남았으니 확인하기 위해 딕셔너리를 호출해 보자!

print(@@@@@@@@@@@@@@@@@@@@@@@@@@data[message])를 def post 안에 입력 후 3창에서 http POST localhost:8000/products message="Hello", number=10를 입력, 1창에서 Hello가 나오는 것을 확인한다(@@@@@@@@@@@@@@@는 Hello를 더 쉽게 찾기 위해 보기 편하려고 넣은 것)

✨print를 잘 써보자. print는 최고의 디버거✨


step 3. CREATE

view.py의 def post에서

Drink 클래스의 안에 값들을 보기 편하게 위에다 빼준다(ex korean_name = data['korean_name']

Drink.object.create에서 Drink라는 클래스 잘 확인 후 위에서 보기 편하게 빼주었으니 사진과 같이 넣어주기면 된다.

마지막 제이슨 리스폰스 메시지 값은 알아서 정해주고, status를 201(create는 보통 201)로 수정해준다.


터미널 2창에서 mysql> select * from drinks;를 해준 후 drinks를 본 후,

3창에서

http POST localhost:8000/products korean_name='제주 비자림 콜드 브루' english_name='Jeju Forest Cold Brew' description=' 제주지역 한정음료' category_id=1 를 입력해준다. (여기서 처음 products가 drinks랑 헷갈렸는데 내가 만든 products 앱을 넣어주는 게 맞는 거 같다. 나머지 값은 내가 넣고 싶은 값을 넣어주면 된다)

다시 2창에서 mysql> select * from drinks;를 해주면 정보가 들어가있는 걸 확인할 수 있다!

profile
할 수 있다, 할 수 있다, 아자뵤!

0개의 댓글