일상I생각

django-ninja Put Patch Method에서 POST 데이터가 없어서 생기는 문제

bepuri 2022. 6. 15. 12:00
728x90

https://thihara.github.io/Django-Req-Parsing/

 

Parsing Unsupported Requests (PUT, DELETE, etc.) in Django

Django is a mature web framework for Python. It does it’s job well, however anyone writing a RESTful API in Django will soon find that it lacks some of the basic request parsing you would expect from a web framework.

thihara.github.io

 

DRF에서는 알아서 해줘서 위 처리를 해준다고 한다, 근데 django-ninja를 쓰다가 PUT method 사용시 image를 Optional하게 업데이트 하고 싶은 상황이 있었다.

#자세한 상황은 아래 이슈 참고.

https://github.com/vitalik/django-ninja/issues/473

 

[BUG] Unable to PUT empty image (always get 'field required' message) · Issue #473 · vitalik/django-ninja

Describe the bug class Item(Schema): name: str description: str = None price: float quantity: int @api.put("/items/{item_id}") def update(request, item_id: int, item: Item): return {"...

github.com

 

근데 django-ninja에서는 request의 content-type이 아니라 실제 서버에서 선언한 api에 따라서 content-type을 정해놓고 처리하도록 해뒀다.

따라서 PUT으로 json 타입의 payload를 담은 request를 보내더라도 서버 쪽에선 해당 api가 multipart-form으로 와야되면 항상 multipart-form 형태의 데이터로 간주하고 내부적인 로직을 짜둔것이다.

 

그러다보니 multipart-form 형태의 코드는 django-ninja에서 POST안에 있는 데이터를 기준으로 request처리를 해주는데 PUT은 당연히 request.POST 데이터가 비어있기 때문에 정상적으로 처리가 되지 않았다.

이게 말로는 무슨말인지 헷갈릴 수 있으나 최상단 글을 읽어보면 쉽게 이해할 수 있을것이다.

 

나 또한 한참 헤매다가 비슷한 상황을 경험한 개발자들의 솔루션을 참고해서 해결했다.(1번째 링크 or 두번째 링크의 코멘트에 남겨둔 이슈번호 참고)

728x90