Today I Learned
날짜
2025년 1월 10일 금요일
내용
is_valid()
페이스북 로그인을 구현하고 있다. 열심히 API를 만들었더니 처음 보는 오류가 뜬다.
“message”: “You must call
.is_valid()
before accessing.validated_data
.”
알아보니.. 시리얼라이저에서 발생하는 오류였다.
1
2
3
4
5
6
7
8
9
10
11
12
def get(self, request, shop_id):
try:
data = ShopFacebookProfile__Manager.get_by_shop_id(shop_id=shop_id)
...
def patch(self, request: Request, shop_id: int):
try:
serializer = ShopFacebookProfile__Serializer(data=request.data)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
...
두 요청의 차이는 입력 데이터를 직렬화 과정에서 데이터를 검증하는지가 있다. 첫번째 get
요청은 데이터를 받아서 별다른 직렬화를 진행하지 않는다. 따라서 데이터가 예상하는 것과 전혀 다른 것이 들어와도 요청 수준에서는 어떤 검증도 하지 않는다. 물론 내부 로직이 진행되는 과정에서 데이터 형식이 달라 함수들이 오류를 뱉는 것은 별개의 문제지만…
반면 is_valid
를 쓰면 요청을 받을 때 데이터 형식이 시리얼라이저를 통해 검증된다. 따라서 잘못된 요청 형식이 들어와도 곧바로 뱉어진다.
회고
시리얼라이저는 참 어렵다.