백엔드 Back-end/장고 Django

DRF(Django Rest Framework) API 서버에 requests로 PUT할 때 나타나는 이상현상

Tap to restart 2022. 4. 29. 15:00
반응형

BooleanField로 설정한 필드의 값이 만약 default=false라면 모두 false로 변경된다. 

 

간단히 테스트를 위해서 DRF로 API 서버를 만들었다. 주요 모델은 아래처럼 생겼다. 

(예제코드: DRF CRUD)

 

모델

class Category(models.Model):
    name = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class Beverage(models.Model):
    name = models.CharField(max_length=200)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    price = models.IntegerField()
    is_available = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

 

서버를 실행하고 beverages에 아메리카노를 추가했다. 잘 들어가는 것을 확인할 수 있다. 

PUT을 하면? 필수 필드값이 빠졌다고 안 된다. 

Postman PUT

is_available은 필수값이 아니라 나머지 3개 값만 추가해서 PUT을 요청하면 잘 되는 것을 볼 수 있다. 

Postman으로 테스트하면 is_available이 바뀌지 않는다. 그대로 true다.

 

requests PUT

아래처럼 간단히 requests로 PUT 요청을 실행한다.

import requests
data = {
        'name': 'americano',
        'category': 1,
        'price': '3800',
    }
response = requests.put('http://127.0.0.1:8000/beverages/1/', data=data)
print(response)

정상작동한다. 그런데!!! 직후 GET을 해보면 false로 바뀌는 걸 볼 수 있다. 

request PATCH

import requests
data = {
        'price': '3800',
    }
response = requests.patch('http://127.0.0.1:8000/beverages/1/', data=data)
print(response)

이번에는 PATCH로 요청해본다.

당연히 PATCH로 하면 is_available 값이 그대로 true다. 

 

PUT이 원래 Replace 개념이 있는 것은 알지만(참고: Q. HTTP PUT 메소드와 PATCH 메소드의 차이는?) 왜 도대체 Postman으로 하면 is_available 값이 바뀌지 않고, requests로 하면 바뀌는 걸까. 아직 그 이유는 알아내지 못했다.

 

결론

requests로 PUT 쓰지 말고 PATCH만 쓰자. 

아니면 DRF로 API 서버 만들 때 PUT을 PATCH처럼 쓰지 말자. 정말 PUT으로 쓰자. 또는 PATCH만 쓰자.

 

반응형