[실습]
Django REST framework
Home - Django REST framework
www.django-rest-framework.org
- Django에서 REST API를 만들수 있도록 도와주는 library
Postman
Postman API Platform | Sign Up for Free
Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.
www.postman.com
- Django 서버에게 요청을 보낼 client의 역할을 해줄 프로그램
- app 생성 및 등록, url 패턴 분리, model생성 및 seeding 진행
- mysite/urls.py
urlpatterns = [
path("admin/", admin.site.urls),
path("articles/", include("articles.urls")),
]
- drf library 설치
$ pip install djangorestframework
- library 등록
- mysite/settings.py
INSTALLED_APPS = [
...
'rest_framework',
]
serializer
- data인 객체(QuerySet)를 JSON형식으로 바꿔준다.
- app 폴더 내에 serializers.py 생성
- articles/serializers.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
Read(전체)
- 어떤 데이터를 조회할껀지 지정해줘 → db에서 데이터 가져와줘(GET) → 시리얼라이즈해줘 → 응답해줘
- articles/urls.py
urlpatterns = [
path("", views.article_list)
]
- articles/views.py
from .models import Article
from .serializers import ArticleSerializer
from rest_framework.decorators import api_view
from rest_framework.response import Response
@api_view(["GET"])
def article_list(request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
Read(하나)
- 어떤 데이터를 조회할껀지 지정해줘(pk) → db에서 데이터 가져와줘(GET) → 시리얼라이즈해줘 → 응답해줘
- articles/urls.py
urlpatterns = [
path("", views.article_list),
path("<int:pk>/", views.article_detail),
]
- articles/views.py
@api_view(["GET"])
def article_detail(request, pk):
article = Article.objects.get(id=pk)
serializer = ArticleSerializer(article)
return Response(serializer.data)
Create
- 주어진 스키마에 맞는 데이터를 입력받아(client) → 그 데이터를 저장해줘(POST) → 응답해줘
- RESTful하게 생각해보면,
- article을 만들어줘!
- /articles 에 POST요청을 해줘!
- articles/urls.py
urlpatterns = [
path("", views.article_list),
path("<int:pk>/", views.article_detail),
]
- articles/views.py
@api_view(["GET", "POST"])
def article_list(request):
if request.method == "GET":
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
# return Response(serializer.data)
return Response(serializer.data)
elif request.method == "POST":
data = request.data
serializer = ArticleSerializer(data=data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=201)
- request / response
- 올바른 요청에 대해 → Body (O)
- 잘못된 요청에 대해 → Body (X)
Validation
- 검증(Validation)은입력된 데이터가 예상되는 형식, 길이, 범위, 구조 등을 충족하는지 확인하는 과정이다.
- 서버 측 검증(Server-side Validation): 서버에서 데이터를 검증하고, 올바르지 않은 데이터는 클라이언트에게 에러 메시지를 반환하며, 보안상 중요한 검증이다.
- 400 (Bad Request)
- 클라이언트 측 검증(Client-side Validation): 웹 페이지나 앱에서 사용자가 입력한 데이터를 즉시 검증하여 잘못된 데이터를 제한하며, 사용자 경험을 향상시키는 데 유용하다.
Update
- 주어진 스키마에 맞는 데이터를 입력받아(client) → 어떤 데이터를 바꿀껀지 지정해줘(pk) → 그 데이터를 수정해줘(PUT) → 응답해줘
- articles/urls.py
urlpatterns = [
path("", views.article_list),
path("<int:pk>/", views.article_detail),
]
- articles/views.py
@api_view(["GET", "PUT"])
def article_detail(request, pk):
if request.method == "GET":
article = Article.objects.get(id=pk)
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == "PUT":
article = Article.objects.get(id=pk)
data = request.data
serializer = ArticleSerializer(article, data=data)
# serializer = ArticleSerializer(article, data=data, partial=True)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
Delete
- 어떤 데이터를 삭제할껀지 지정해줘(pk) → 그 데이터를 삭제해줘(DELETE) → 응답해줘
- articles/urls.py
urlpatterns = [
path("", views.article_list),
path("<int:pk>/", views.article_detail),
]
- articles/views.py
@api_view(["GET", "PUT", "DELETE"])
def article_detail(request, pk):
if request.method == "GET":
article = Article.objects.get(id=pk)
serializer = ArticleSerializer(article)
return Response(serializer.data)
elif request.method == "PUT":
article = Article.objects.get(id=pk)
data = request.data
serializer = ArticleSerializer(article, data=data)
# serializer = ArticleSerializer(article, data=data, partial=True)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
elif request.method == "DELETE":
article = Article.objects.get(id=pk)
article.delete()
return Response(status=204)
'Django' 카테고리의 다른 글
마이그레이션 : 관련 모델이나 필드가 해석되지 못할 때 (0) | 2024.03.19 |
---|---|
Django : backend framework(5) (0) | 2024.03.19 |
Django : backend framework(4) (0) | 2024.03.18 |
Django : backend framework(2) (0) | 2024.03.14 |
Django : backend framework(1) (0) | 2024.03.14 |