반응형

1.Rest Architecture 

-REST란? : Representational State Transfer  / “자원을 이름으로 구분하여 상태를 전송하는 방법”

 

-Rest 설계 필요 충분 조건

   1. SERVER – CLIENT 

   2. STATELESS #클라이언트의 이전 상태를 기록하지 않는 연결방식을 취함 

   3. CACHE #캐쉬 처리기능 

   4. UNIFORM INTERFACE #일관된 인터페이스 

  • Resource가 URI로 식별이 되어야한다.
  • CRUD를 HTTP메세지로 수행 가능해야한다.
  • 메세지는 자체로 모든 것이 설명 가능해야한다.
  • 어플리케이션의 상태는 하이퍼링크를 이용해 전이되야한다.(HATEOAS)

   5. LAYERED SYSTEM #다칭적인 구성

   6. CODE-ON-DEMAND #JS처럼 서버와 같이 원격지에서 보낸 코드로 메소드를 실행시킬 수 있는 것

 

-API란? Application Program Interface / Request, Response로 오가는 구조화된 데이터

-Rest API  : REST의 설계방식을 잘 따르는 API / 대부분의 API는 rest를 잘 따르지 않는다 / Json은 모든 태그가 만들어져 있지않고, 만든 이가 정의하기 나름이기 때문에

 

    -> 필요한 이유?

         : 백엔드, 프론트엔드 분리 / 독립적인 네트워크 향상 가능 / 클라이언트 플랫폼 다양화 지원 가능

 

Django VS Django Rest Framework

  Django Djnago Rest Framework
만들어지는 것 웹 어플리케이션 RESTful API
전달하는 데이터 HTML Form(HTML, CSS, JS) JSON 데이터
데이터를 담는 곳  Form / ModelForm Serializer/ ModelSerialier
model로 부터 Field 읽어온다
유효성 검사

 

Form VS Serializer

 

 

Serializer vs ModelSerialier

Form과 ModelForm이 존재하듯이 Model만 작성할 줄 알면
더 간편하게 Serializer를 사용할 수 있게하는 ModelSerialier에 대해서 공부한다.
ModelSerialier는 쿼리셋과 모델 직렬화를 알아서 해준다.

 

2.Serializer 실습 

가상환경 생성

$python -m venv myvenv

 

필요 패키지 설치

$pip install djangorestframework

$pip install django

 

django 프로젝트 생성

$django-admin startproject rest

-> 생성 후 cd rest 로 폴더 이동

 

django app 생성

$ python manage.py startapp post

 

settings.py에 앱 추가(장고 프레임워크도 등록)

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'post',
]

url 관리

   -> 앱 폴더 내부에 urls.py 생성(계층적 url 관리 위해 분할) ##아니 나는 urls.py를 완성하지 못하면 마이그레이트가 안된다.. 이거먼저!

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

router = DefaultRouter() #ROUTER 객체 생성
router.register('post', views.PostViewSet) #ROUTER 객체의 REGISTER 함수(첫번째 인자 = URL, 함수)

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

#rest_framework는 ROUTER을 사용해 URL을 결정한다
#CRUD 기반으로 URL을 설정한다

  

    -> 프로젝트 폴더 urls.py 에 모듈 추가

from django.contrib import admin
from django.urls import path, include
import post.urls


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(post.urls)),
]

앱 폴더의 models.py 에 모델 클래스 정의 (post/models.py)

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
# Create your models here.

앱 폴더 내부에 serializer.py 생성 및 작성 (어떤 클래스의 어떤 필드를 사용할 것인지)

from .models import Post
from rest_framework import serializers

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['title', 'body'] 
        # 모든 필드를 사용할 경우 '__all__' 사용 가능

views.py 작성하기

-> rest_framework 의 viewsets 모듈과 작성한 모델serializer 추가

 

from rest_framework import viewsets
from .models import Post
from .serializer import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    
Django Rest Framework는 Class base View 이기에 
view로서 class를 작성한다
viewsets의 ModelViewSet을 상속받는다.

 

##ROUTER

▪ ViewSet에는 여러가지 메소드(함수)들이 있다 

      ex) retrieve() , destroy(), …

▪ 이 모든 것을 하나의 path()로 처리해 주는 것은 불가능하다.

▪ Path함수를 묶어준다 == path함수의 두번째 인자로 오는 함수를 묶는다 

     -> Path(요청을 처리할 url, 요청을 인자로 받아 처리할 함수, namespace)

 

#실행 결과(api 서버 보기)

1. api root : urls.py 에 작성된 DefaultRouter 에 의해 만들어진 기본적인 환경 / 처음 보여지는 화면은 GET 요청을 할 수 있는 URL이 보여진다.

 

2.POST API

-request : 127.0.0.1/8000/post

 

-response

 

post 후 post/1로 들어가면 allow 부분에 put이 들어간 것을 볼 수 있음

각 객체에 pk 값 부여하기 

-> serializer.py 파일의 PostSerializer 을 수정한다

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['id', 'title', 'body'] 

새로 고침 후 보면 id 값을 직접 확인할 수 있는 것을 볼 수 있다. 

id 값 : 각 인스턴스에 붙는 고유 번호

Read Only 설정하기

 -> serializer.py 파일의 PostSerializer을 수정한다

 -> read_only_fields 에 read_only 속성을 적용할 필드를 tuple에 추가한다

 -> 수정 시 read_only 부분이 true로 바뀌는 것을 볼 수 있다.

 -> write_only부분도 같은 방법으로 수정하면된다!

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = "__all__"
        read_only_fields = ("title",)

반응형

'Web > Django' 카테고리의 다른 글

[Django] Instagram 클론 코딩(1)  (0) 2020.03.17
[Django_심화]3 - viewset & router  (2) 2019.11.03
[Django_심화]1 - 준비운동  (0) 2019.11.02
[6주차]Form  (0) 2019.03.06
[5.5주차]Faker  (0) 2019.03.05

+ Recent posts