TIL_231113_트러블슈팅

Sol Lee·2023년 11월 13일
0

레시피 저장 시 form-data로 받을 경우 순서 저장 오류

레시피, 재료, 조리순서의 모델을 분리하고 api를 각각 작성했으나 1번 요청 받을 때 백에서 각각 모델에 처리하도록 수정하고자 함.

{
	"description": "레시피 관련 정보들",
	"title": "레시피 이름",
	"recipe_thumbnail": 파일추가,
	"recipe_ingredients": "아욱, 양파, 두부, 된장, 감자",
	"recipe_order":[
		{
			"content": "아욱 섬유질 제거",
			"order": 1
			"recipe_img": 파일추가,
	  },
		{
			"content": "물끓이기",
			"order": 2,
			"recipe_img": 파일추가,
	  },
		# 조리 순서만큼 반복
	]
}

postman에서 raw data로 보냈을 때는 문제가 없었는데, 사진을 추가하기위해 form-data로 보내려고 하자 오류 발생.

확인 해보니 form-data의 경우 file이나 text로 전달이 되어서 list안에 dict 구조로 되어있던 recipe_order가 str으로 변경되어서 오류가 발생함.
그리고 postman으로 테스트할 때 조리사진(recipe_img)의 이미지를 보낼 방식이 없었음.

일반 텍스트의 경우는 원래의 구조로 변경 가능했으나, 이미지의 처리를 고민함.

form-data안의 form-data를 받을 방법을 찾을 수 없어 생각해낸 방식은 2가지

  1. 그냥 레시피 순서를 분리하여 순서만큼 n번의 요청을 보내기
  2. recipe_img를 분리하여 request body에 파일로 추가하기

2번 방식을 선택하여 키값은 recipe_order의 order 값으로 하고 이미지를 추가하도록 수정

한번의 요청을 받아 레시피,재료,순서 전부 일괄 저장되도록 수정함.

  • 작성 코드
    orders = eval(request.data["recipe_order"]) # str -> [{},{}] 형태로 변경
    for i in range(1, len(orders)+1):
    		# 조리 순서 이미지 없으면 null, request body에 조리 순서 이미지의 키값 없으면 null
    		recipe_img = request.data.get(f'{i}') if request.data.get(f'{i}') else None
    		order_image_data = {
    				"order": i,
    				"content": orders[i-1]["content"],
    				"recipe_img": recipe_img,
    		}
    		order_image_serializer = OrderCreateSerializer(data=order_image_data)
    		if order_image_serializer.is_valid():
    				order_image_serializer.save(article_recipe_id=recipe.id)
    		else:
    				return Response("순서를 확인해주세요.", status=status.HTTP_400_BAD_REQUEST)

🤔

작업을 하면서도 요청을 n번 보내는 것보다는 백에서 이렇게.. 처리하는게 효율적인게 맞나...? 의문이 들었다. 그냥 원래있는 api로 보내면 쉬운데... 조리순서 작성은 nnn개씩 하는 것도 아니고 많아봐야 1n개 정도 일 것 같은데... 이 부분은 다음 피드백 시간에 물어봐야겠음

profile
직업: 개발자가 되고 싶은 오레오 집사

0개의 댓글