'll Hacker
[WIL] 5주차, Django REST Framework(DRF) 본문
django 웹 프레임워크를 기반으로 한 도구세트로, django를 이용해서 REST api를 만들기 위한 라이브러리
Django | Django REST Framework |
자체 웹 템플릿에게 데이터 전달 풀스택 개발을 위한 목적으로 사용 html을 응답 |
플랫폼의 클라이언트에게 데이터를 전달 백엔드 API 서버 개발을 위한 목적으로 사용됨. json 형태의 response 응답 |
RESTful API? 간단하고 효율적이고 호환성이 높음!
REST : 인터넷에서 컴퓨터 또는 시스템 간 정보를 주고 받는 방식의 하나
- URL과 웹 페이지를 보거나 변경하는 행위를 사용하여 정보를 쉽고 간단히 찾을 수 있게 함.
- 웹 아키텍처 스타일로 리소스의 상태를 HTTP 메서드를 통해 전송하는 방식
REST 원칙에 기반해 서버의 리소스를 클라이언트와 주고받는 웹 서비스
- 리소스는 고유한 URL로 식별되며, 서버는 요청에 따라 데이터를 제공하거나 수정, 삭제 등의 작업을 처리
- REST의 설계원칙을 따르기 때문에 확장성과 유지보수성이 뛰어남
Serialization?
serializer는 복잡한 데이터 형식(예: Django 모델 인스턴스, 쿼리셋)을 JSON, XML과 같은 API에서 사용하기 쉬운 형식으로 변환하는 역할을 함.
직렬화(Serialization) : 파이썬 객체를 JSON, XML 등의 형식으로 변환하여 API 응답으로 전송
역직렬화 : API 요청으로 받은 JSON. XML 데이터를 파이썬 객체로 변환
데이터 표현 : Serializer는 데이터를 표현하는 방식을 정의
Serializer 사용방법
1. Serializer 클래스 정의
- Serializers.Serializer 클래스를 상속받아 Serializer 클래스를 정의.
- 클래스 내부에서 CharField, IntegerField 등의 필드를 정의하여 데이터 형식을 지정.
2. Serializer 인스턴스 생성
- Serializer 클래스의 인스턴스를 생성.
- 직렬화할 객체를 data 인수로 전달
3. 데이터 직렬화
- serializer.data 속성을 사용하여 직렬화된 데이터를 가져옴.
4. 데이터 역직렬화
- serializer.is_valid( ) 메서드를 사용하여 데이터 유효성을 검사하고, serializer.validated_data 속성을 사용하여 유효성을 검사를 통과한 데이터를 가져옴.
여기까지..! 이론을 봤다면 이젠 실습을 해보자.
1. DRF 설치
pip install djangorestframework
2. settings.py의 INSTALLED_APPS 에 rest_framework 추가
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # Django REST framework
'myapp', # 새로 만든 앱 추가
]
3. 모델 생성
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
published_date = models.DateField()
def __str__(self):
return self.title
4. app 하단에 serializer.py 생성 후 모델에 맞는 serializer 작성
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ['id', 'title', 'author', 'publication_date']
# fields = '__all__' # 모든 필드를 포함
5. serializer을 활용해 api 작성
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Book
from .serializers import BookSerializer
class BookList(APIView):
def get(self, request):
books = Book.objects.all() # 모든 책 가져오기
serializer = BookSerializer(books, many=True)
return Response(serializer.data)
def post(self, request):
serializer = BookSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=201)
return Response(serializer.errors, status=400)
APIView?
Django REST Framework에서 제공하는 가장 기본적인 뷰 클래스
GET, POST, PUT, DELETE와 같은 HTTP 메서드를 처리하는 메서드를 제공
<주요 특징>
1. HTTP 메서드 처리
- APIView는 GET, POST, PUT, DELETE 등의 HTTP 메서드를 처리하기 위한 메서드를 직접 정의
- 이를 통해 각각의 HTTP 요청에 따라 다른 로직을 수행
2. 직접적인 응답 처리
- APIView는 JSON이나 다른 형식으로 데이터를 직접 응답할 수 있도록 Response 객체를 제공
- 이를 통해 데이터를 직렬화하거나 상태코드와 함께 응답
3. 권한 및 인증
- APIView는 DRF에서 제공하는 인증 및 권한 시스템과 쉽게 연동됨
- 예를 들어, 특정 사용자만 접근할 수 있도록 제어할 수 있음
4. 직렬화 지원
- APIView에서는 데이터를 직렬화하고 역직렬화하는 기능을 제공
- 이를 활용해 요청 데이터를 저장하거나 응답 데이터를 클라이언트에 전달
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Book
from .serializers import BookSerializer
class BookList(APIView):
def get(self, request):
books = Book.objects.all() # 모든 책 가져오기
serializer = BookSerializer(books, many=True)
return Response(serializer.data)
def post(self, request):
serializer = BookSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
1. get (self, request) 함수 - 모든 책 데이터를 가져와 반환
<작동방식>
- Book.objects.all( ) : Book 모델에 저장된 모든 책 객체를 가져옴
- BookSerializer(books, many=True) :
BookSerializer를 사용하여 책 객체들을 직렬화함.
many = True : 여러 개의 객체를 직렬화할 때 필요한 옵션 - Response(serializer.data) : 직렬화된 데이터를 JSON 형식으로 클라이언트에게 반환함
2. post(self, request) 함수
<작동방식>
- BookSerializer(data=request.data) : 클라이언트가 요청으로 보낸 데이터를 BookSerializer를 통해 직렬화함
- Serializer.is_valid( )
요청 데이터가 유효한지 검증
예 : 필수 필드가 모두 포함되었는지 확인 - 유효하다면:
serializer.save( ) : 데이터를 저장(새로운 Book 객체 생성)
클라이언트에게 성공 응답과 함께 생성된 데이터를 반환 (status.HTTP_201_CREATED) - 유효하지 않다면 :
에러 메시지와 함꼐 실패 응답을 반환 (staus.HTTP_400_BAD_REQUEST)
데코레이터 - 기능을 추가하거나 수정할 수 있는 함수
다른 함수나 메서드에 적용되어 코드의 중복을 줄이고 가독성을 높임
Django에서는 인증이나 권한 체크, 캐싱 등 반복되는 작업을 데코레이터로 쉽게 처리
def my_decorator(func):
def wrapper():
print("함수가 실행되기 전에 이 코드가 실행됩니다.")
func()
print("함수가 실행된 후에 이 코드가 실행됩니다.")
return wrapper
@my_decorator
def say_hello():
print("안녕하세요!")
say_hello()
@login_required
사용자가 로그인된 상태에서만 뷰에 접근할 수 있도록 제한하는 데코레이터
비로그인 사용자가 접근하려 할 때 로그인 페이지로 리디렉션
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
# 로그인된 사용자만 접근 가능
pass
@permission_required
특정 권한이 있는 사용자만 뷰에 접근할 수 있도록 하는 데코레이터
권한이 없는 사용자는 접근이 제한됨
from django.contrib.auth.decorators import permission_required
@permission_required('app_name.permission_code')
def my_view(request):
# 특정 권한이 있는 사용자만 접근 가능
pass
@require_http_methods
특정 HTTP 메서드만 허용하도록 하는 데코레이터
예를 들어, POST 요청만 허용하거나 GET요청만 허용
from django.views.decorators.http import require_http_methods
@require_http_methods(["GET", "POST"])
def my_view(request):
# GET과 POST 요청만 허용
pass
@csrf_exempt
CSRF 검사를 제외시키는 데코레이터
외부 서비스와의 통신 등에 사용되지만, 보안 문제가 생길 수 있어서 신중히 사용해야함
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def my_view(request):
# CSRF 검사 없이 작동
pass
CSRF란?
악의적인 사이트(로그인한 상태)가 사용자를 대신해서 요청을 보내는 웹 공격 방식
Django는 CSRF 토큰을 사용해 이를 방지함. 각 요청에 고유한 토큰을 생성하고, 서버에서 요청이 올 때 이 토큰을 확인하여 올바른 출처에서 온 요청인지 확인함.
@cache_page
뷰의 응답을 캐싱하는 데코레이터
성능 향상을 위해 특정 기간 동안 결과를 캐싱해두고, 그 기간 동안에는 같은 요청에 대해 저장된 응답을 반환
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
# 15분 동안 캐시된 응답 반환
pass
오늘의 과제 !!
공공포털 활용 요청을 한다음
Request URL을 받아온다. ▼
일단 먼저 공공포털 서비스가 잘되는지 확인
잘됨...(잘되는건진 모르겠..)
블로그( https://velog.io/@fairytale779/TIL-postman ) 참고함...
이 다음부턴.....모르겠습니다... 데이터베이스에도 저장이 안돼요....
'Dev > GDSC' 카테고리의 다른 글
[WIL] 4주차, Django 사용자 인증 시스템 (0) | 2024.10.11 |
---|---|
[WIL] 3주차, Django의 모델 및 데이터베이스 (1) | 2024.10.04 |
[WIL] 2주차, Django의 MVT 아키텍처 이해 (0) | 2024.09.27 |
[WIL] 1주차, Django 기본 이해 및 환경설정 (0) | 2024.09.20 |
gdsc ewha 합격 후기 (1) | 2024.09.10 |