오늘의 배운 것
- 장고 심화 - 1, 2주차
장고 심화
- HTTP와 웹의 동작 방식
- 웹브라우저의 흐름
- 프로토콜 계층
- URI
- HTTP - 클라이언트 서버 구조 / 무상태 프로토콜(stateless)
- 데이터 전송 - HTML Form / HTML API
- HTTP 상태 코드
- HTTP 헤더
- 쿠키, 캐시
- Postman
웹 개발을 하면서 API에 요청을 하고 결과를 확인하고 싶을 때,
브라우저에 직접 API URL을 작성해가며 결과를 확인할 수 있지만, 번거롭고 GET 방식 요청등 간단한 정도만 수행할 수 있다.
포스트맨을 이용해 대상 URL에 요청할 메소드를 지정할 수 있고, 결과 확인도 빠르고 간편해 API를 테스트하기 좋다
- DRF ( Django Rest Framework)
CURD를 단순 함수가 아니라 클래스를 사용함으로써 여러 추가 기능들 보강 가능, ex) 클래스 상속 등
기존의 방식대로 만들어보자면
@api_view(['GET', 'POST'])
def articleAPI(request):
if request.method == 'GET':
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
print(serializer.errors)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
이 함수를 클래스화 하면
class ArticleList(APIView):
def get(self, request, format=None):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
@swagger_auto_schema(request_body=ArticleSerializer)
def post(self, request, format=None):
serializer = ArticleSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
print(serializer.errors)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
* swagger : 스웨거는 개발자가 REST 웹 서비스를 설계, 빌드, 문서화, 소비하는 일을 도와주는 대형 도구 생태계의 지원을 받는 오픈 소스 소프트웨어 프레임워크이다. - 위키백과
* 시리얼라이저(serializer) - 데이터를 json화
models.py
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return str(self.title)
serializers.py
from rest_framework import serializers
from articles.models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = "__all__"
{
"title":"타이틀",
"content":"내용",
"created_at":"생성시간",
"updated_at":"수정시간"
}
지금까지 배워왔던 장고의 기능을 기반으로 이제 DRF를 사용해 CRUD를 json형태로 구현해 보았다.
이미 두번의 프로젝트 내에서 장고 프레임워크의 문제 - ex) 인스타그램 클론코딩 프로젝트 중 post뿐만 아니라 좋아요, 댓글 기능을 사용할 때에도 서버에 request를 보낼때마다 redirect, render로 response해 무조건 새로고침이 들어감 - 에 대해 인지하고 있었고,
또한 이미지 업로드, 모달 창 열기 기능 등에 js를 이용하면서 겉핥기로 배웠던 기능들에 대해 본격적으로 배우게 될 것 같다. 이제 진짜로 웹페이지를 만드는데 쓰는 코드들을 아직 직접 써보는건 아니고 살짝 엿보는 느낌? 빠릿빠릿하게 흡수해봅시다..