Django JSON 응답뷰

2022. 3. 12. 14:27강의 정리/Django REST Framework

반응형

처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!

 


 

Django JSON 응답뷰 만들기


REST API 스타일로 포스팅 API 서비스를 제공할 때

 /post/ 주소

  • GET 방식 요청 : 목록 응답
  • POST 방식 요청 : 새 글 생성하고, 확인 응답

예시 코드

def post_list(request):
    if request.method == 'POST':
        # POST 일시 새 글 저장을 구현
        form = PostForm(request.Post, request.FILES)
        if form.is_valid():
            post = form.save()
            # JsonResponse은 json 응답을 만드는데 사용합니다.
            # 유효성 검사에 통과했다면
            return JsonResponse(post)
        # 유효성 검사에 통과하지못했다면    
        return JsonResponse(form.errors)
    else:
        # GET 일시 목록 응답을 구현
        return JsonResponse(Post.objects.all())

 

 /post/10/ 주소

  • GET 방식 요청 : 10번 글 내용 응답
  • PUT 방식 요청 : 10번 글 수정 / 저장하고, 확인 응답
  • DELETE 방식 요청 : 10번 글 삭제하고, 확인 응답

예시 코드

# 특정 pk에 대해 접근
def post_detail(request, pk):
    if request.method == 'PUT':
        # PUT 일시 해당 PK글 수정, 갱신을 구현
        # QueryDict은 사전형 타입의 클래스로 같은 키에 대해 복수의 값을 갖도록 커스터마이즈하게 해준다.
        put_data = QueryDict(request.body)
       
        # 해당 pk글을 수정할 instance로 둡니다.
        form = PostForm(put_data, instance=post)
        if form.is_valid():
            post = form.save()
            # JsonResponse은 json 응답을 만드는데 사용합니다.
            # 유효성 검사에 통과했다면
            return JsonResponse(post)
        # 유효성 검사에 통과하지못했다면    
        return JsonResponse(form.errors)
    
    elif request.method == 'DELETE':
        # DELETE 일시 해당 PK글 삭제를 구현
        post.delete()
        return HTTPResponse()
    
    else:
        # GET 일시 해당 PK글 내용 응답을 구현
        return JsonResponse(Post.objects.all())

 

 

총 5개의 뷰 처리가 필요해집니다.

 

_ 만약 다른 모델에 대해서 동일한 기능을 구현한다면, Model/Form을 제외하고는 위 코드와 같이 거의 정형화된 패턴입니다. Django REST Framework (=DRF)는 이런 정형화 된 중복을 줄일 수 있도록 도와주는 CBV를 비롯해 다양한 기능을 지원합니다.

 

 

 


 

참고

HTTP 동사(메소드)

 

_GET 메서드는 특정 리소스의 표시를 요청합니다. GET을 사용하는 요청은 오직 데이터를 받기만(조회) 합니다.

 

_POST 메서드는 특정 리소스에 엔티티를 제출할 때 쓰입니다, 즉 새 리소스를 생성 요청합니다. 이는 종종 서버의 상태의 변화나 부작용을 일으킵니다.

 

_PUT 메서드는 기존 리소스를 대체하고, 요청 본문에 갱신할 리소스 정보를 제공합니다.

 

_DELETE 메서드는 특정 리소스를 삭제합니다.

 

_PATCH 메서드는 리소스의 부분만을 수정하는 데 쓰입니다.

https://developer.mozilla.org/ko/docs/Web/HTTP/Methods

 

HTTP 요청 메서드 - HTTP | MDN

HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 "HTTP 동사"라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부

developer.mozilla.org

 


 

 


 

DRF 설치하기


https://www.django-rest-framework.org/

 

Home - Django REST framework

 

www.django-rest-framework.org

 

0. 터미널에 아래 코드를 입력해줌으로서 설치를 해줍니다.

pip install djangorestframework~=3.11.0

 

추가로 항상 requirements.txt를 통해서 사용하고 있는 skill들을 기록해놓아야 합니다.

 

django~=3.0.0
djangorestframewrok~=3.11.0

 

1. settings.INSTALLED_APPS에 "rest_framework"를 추가해줍니다.

INSTALLED_APPS = [
    # Django Apps
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.humanize',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # Third Apps
    'debug_toolbar',
    'bootstrap4',
    'django_pydenticon',
    'easy_thumbnails',
    'rest_framework', # 추가

    # Local Apps
    'accounts',
    'insta',
  
]

 

2. ulrpatterns 다음 패턴에 추가해줍니다.

urlpatterns = [
    path('api-auth', include('restframework.ulrs')), # 추가
]

 

 

DRF 샘플 구현하기  (매우 기본 샘플)

 

myapp/models.py

from django.db import models

# Create your models here.

class Post(models.Model):
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

myapp/serializers.py

from rest_framework.serializers import ModelSerializer
from .models import Post

class PostSerializer(ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

 

myapp/views.py

from rest_framework.viewsets import ModelViewSet

from .serializers import PostSerializer
from .models import Post

class PostViewSet(ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer





"""
DRF를 사용하지 않았을 때의 작업 방법

def post_list(request):
    # 최소 2개의 분기 ex) POST, GET
    pass

def def_detail(request, pk):
    # request.method # => 최소 3개 분기 ex) GET, PUT, DELETE
    pass
"""

 

myapp/urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter

from . import views

# 1개의 CBV에서 2개의 url을 만드는 코드
router = DefaultRouter()
router.register('post', views.PostViewSet) # 2개의 URL을 만들어줌.
# 위의 과정까지 마치면
# router.urls에 리스트 형태로 url들이 저장되어있음.


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

 

root 페이지의 모습

 

/post/ 페이지의 모습
DRF에서 기본 제공되는 로그인 페이지 // django의 auth를 이용
/post/ 페이지에서 POST를 했을 때 JSON 형태로 저장이 된다.

 

 


다양한 HTTP 클라이언트 프로젝트


_ 유저가 웹브라우저를 통해 웹페이지간 이동할때

 

_ 웹 프론트엔드에서 JavaScripts를 통해 호출 할 때 ex) Ajax

 

_ Android/ios 앱 코드를 통한 호출 할 때

 

_ 웹 요청 개발 프로그램을 통한 호출 할 때 ex) Postman, request ,HTTPie

 

 

 

그 중 HTTPie를 통한 HTTP 요청

https://codermun-log.tistory.com/144

 

TIL.54 Httpie를 이용해 통신해보기(Django, MySQL)

Django_CRUD_2 이전 CRUD_1에서는 모델과 데이터베이스간에 다뤘던 Django QuerySetAPI를 사용하고 연습해봄으로써 손에 익히기 위한 공부였다면 CRUD_2에서는 위에서 배운 내용1의 기본기를 통해서 실제로

codermun-log.tistory.com

 

설치는 아래 코드와 같습니다.

pip3 install httpie

 

HTTPie 명령어

https://ssungkang.tistory.com/entry/Web-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%B9%9C%ED%99%94%EC%A0%81%EC%9D%B8-http-client-Httpie

 

[Web] 사용자 친화적인 http client, Httpie

우리는 직접 웹사이트에 들어가지 않고도 정보를 얻을 수 있습니다. CLI 를 통해 명령어를 입력하는 것으로만으로 말이죠. 앞으로 공부할 django restful API 처럼 API 를 테스트 하는데도 사용할 수 있

ssungkang.tistory.com

 

쉘 > http GET 요청할주소 GET인자명==값 GET인자명==값 

 

쉘 > http --json POST 요청할주소 GET인자명==값 GET인자명==값 POST인자명==값 POST인자명==값

-> 옵션 지정 : application/json -> 요청 데이터를 JSON 직렬화

 

쉘 > http --form POST 요청할주소 GET인자명==값 GET인자명==값 POST인자명==값 POST인자명==값

-> 옵션 지정 : multipart/form-data

 

쉘 > http PUT 요청할주소 GET인자명==값 GET인자명==값 PUT인자명==값 PUT인자명==값

 

쉘 > http DELETE 요청할주소 GET인자명==값 GET인자명==값 

반응형

'강의 정리 > Django REST Framework' 카테고리의 다른 글

DRF ViewSet과 Router  (0) 2022.07.13
DRF mixins 상속을 통한 APIView  (0) 2022.07.12
DRF로 APIView, Json 응답뷰 만들기  (0) 2022.07.11
Django JSON 직렬화  (0) 2022.03.22
Django API와 REST  (0) 2022.03.10