CRUD # 2 Django

Jinsung·2021년 11월 16일
0
post-thumbnail
post-custom-banner

client 준비

서버에 HTTP requetst를 할 수 있는 httpie설치

brew install httpie

http요청 보내기

보낼 데이터

{
    "menu" : "음료",
    "category" : "콜드브루",
    "product" : "맛있는 콜드브루",
    "price" : 5000
}

데이터 http로 보내기

string(=) 외 int로 보낼때는 :=

http -v POST 127.0.0.1:8000/product menu="음료" category="콜드브루" product='맛있는 콜드 브루' price:=5000

App만들기

초기세팅 후 owners app 생성

모델링 후 makemigrations, migrate 진행

확인은 mysql 접속 후 연결한 db에 정상적으로 table이 생성됬는지 확인

from django.db import models
from django.db.models.deletion import CASCADE

# Create your models here.

class Owner(models.Model):
    name = models.CharField(max_length=45)
    email = models.EmailField(max_length=254)
    age = models.IntegerField(default=0)
    
    # db에 table 생성될때 이름을 정해준다.
    class Meta:
        db_table='owners'

class Dog(models.Model):
    owner = models.ForeignKey('Owner', on_delete=CASCADE)
    name = models.CharField(max_length=45)
    age = models.IntegerField(default=0)
    class Meta:
        db_table='dogs'

main urls에서 app쪽으로 mapping(appname:owners)

from django.urls import path, include

urlpatterns = [
    path('owners',include('owners.urls')),
   ]

app에서 urls.py 생성 후 views.py에 있는 클래스에 mapping

from django.urls import path
from .views import *

urlpatterns = [
    path('',OwnersView.as_view()),
    path('/dogs',DogsView.as_view()),

]

views.py 에 연결한 class에 기능을 구현한다.

가져다 쓸 메소드를 위에 import

# http 요청을 받을 메소드
from django.http import request

# http 응답 메소드
from django.http.response import JsonResponse

from django.shortcuts import render

# django.views 에 있는 view 메소드를 가져오고 
from django.views import View

# 정보를 가져올 modeling한 정보도 가져온다.
from .models import Owner, Dog

# 파일 바꿈
import json

POST

POST 메소드는 주로 새로운 리소스를 생성(create)할 때 사용된다. 조금 더 구체적으로 POST는 하위 리소스(부모 리소스의 하위 리소스)들을 생성하는데 사용된다. 성공적으로 creation을 완료하면 201 (Created) HTTP 응답을 반환한다. POST 요청은 안전하지도 않고 idempotent하지도 않다. 다시 말해서 같은 POST 요청을 반복해서 했을 때 항상 같은 결과물이 나오는 것을 보장하지 않는다는 것이다. 그러므로 두 개의 같은 POST 요청을 보내면 같은 정보를 담은 두 개의 다른 resource를 반환할 가능성이 높다.

app : 주인 정보를 생성

app/views.py

# urls에서 mapping해준 주소(class)
class OwnersView(View):

    # post 함수 요청이 오면
    def post(self, request):
    
    	# data를 json 변환
        data = json.loads(request.body)
        
        # 위에랑 연결하면 요청이 들어오면 Owner객체에 정보를 생성한다.
        owner = Owner.objects.create(
            name=data["owner"],
            email=data["email"],
            age=data["age"]
        )
        
        # 리턴으로 메세지가 설정
        return JsonResponse({"result" : "CREATE"}, status = 201)

app : 강아지 정보를 생성

app/views.py

class DogsView(View):
    def post(self, request):
        data = json.loads(request.body)
        owner = Owner.objects.get(name=data["owner"])
        dog = Dog.objects.create(
            owner = owner,
            name = data["dog"],
            age=data["age"]
        )
        return JsonResponse({"result" : "CREATE"}, status = 201)

http 요청보내기

http -v POST 127.0.0.1:8000/owners owner='박진성' email=dksk0101@naver.com age:=28

밑에 화면처럼 나오면 정상적으로 db에 정보가 생성된 겁니다.

Post /owners HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: 127.0.0.1:8000
User-Agent: HTTPie/2.6.0



HTTP/1.1 201 Created
Content-Length: 443
Content-Type: application/json
Date: Mon, 15 Nov 2021 13:18:28 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.7
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

GET

GET 메소드는 주로 데이터를 읽거나(Read) 검색(Retrieve)할 때에 사용되는 메소드이다. 만약에 GET요청이 성공적으로 이루어진다면 XML이나 JSON과 함께 200 (Ok) HTTP 응답 코드를 리턴한다. 에러가 발생하면 주로 404 (Not found) 에러나 400 (Bad request) 에러가 발생한다.

HTTP 명세에 의하면 GET 요청은 오로지 데이터를 읽을 때만 사용되고 수정할 때는 사용하지 않는다. 따라서 이런 이유로 사용하면 안전하다고 간주된다. 즉, 데이터의 변형의 위험없이 사용할 수 있다는 뜻이다. 게다가 GET 요청은 idempotent하다. 즉, 같은 요청을 여러 번 하더라도 변함없이 항상 같은 응답을 받을 수 있다. 그러므로 GET을 데이터를 변경하는 등의 안전하지 않은 연산에 사용하면 안된다.

	# 요청이 들어오면
    def get(self, request):
    	가져올 정보를 변수에 넣고
        owner_list = Owner.objects.all()
        # 리스트 넣고 출력
        results = []
        # 변수정보를 넣고 리스트에 추가한다.
        for owner in owner_list:
            results.append(
                {
                    "name" : owner.name,
                    "email" : owner.email,
                    "age" : owner.age,
                     # 역참조
                    "dog_name" : list(owner.dog_set.values('name'))
                }
            )
        return JsonResponse({"result" : results}, status = 201)

http 요청보내기

http -v GET 127.0.0.1:8000/owners


GET /owners HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: 127.0.0.1:8000
User-Agent: HTTPie/2.6.0



HTTP/1.1 201 Created
Content-Length: 443
Content-Type: application/json
Date: Mon, 15 Nov 2021 13:18:28 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.7
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "result": [
        {
            "age": 28,
            "dog_name": [
                {
                    "name": "뭉치"
                }
            ],
            "email": "dksk0101@naver.com",
            "name": "박진성"
        },
        {
            "age": 28,
            "dog_name": [],
            "email": "dks@naver.com",
            "name": "박재용"
        },
        {
            "age": 28,
            "dog_name": [
                {
                    "name": "고잉"
                }
            ],
            "email": "dks@naver.com",
            "name": "김은혜"
        },
        {
            "age": 28,
            "dog_name": [
                {
                    "name": "뭉"
                },
                {
                    "name": "치"
                }
            ],
            "email": "dks@naver.com",
            "name": "박정현"
        }
    ]
}
post-custom-banner

0개의 댓글