장고 request.POST.get('json_key', False) 값이 None일 때

소요 시간: 3분

장고 뷰에서 request.POST.get('json_key', False)이 None으로 나와 문제를 해결하기 위해 여러 가지를 점검해 보았다.

이 문제가 발생하는 원인은 여러 가지가 있을 수 있는데, 이를 해결하기 위한 몇 가지 체크리스트를 정리해 보았다.


AJAX 요청의 데이터 형식 확인

먼저, AJAX 요청에서 데이터를 올바른 형식으로 보내고 있는지 확인해야 했다. `tracking_enabled` 값을 Boolean으로 처리하려면, JavaScript에서 true/false를 문자열로 전송하지 않도록 주의해야 한다. 그래서 `JSON.stringify`를 사용해 JSON 형식으로 데이터를 전송하도록 코드를 수정했다. 다음과 같은 코드를 작성했다.

$.ajax({
    type: 'POST',
    url: '/update-tracking/',
    contentType: 'application/json',
    data: JSON.stringify({
        'tracking_enabled': trackingEnabled
    }),
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-CSRFToken", csrftoken);
    },
    success: function(response) {
        console.log(response);
        alert('Tracking status updated: ' + response.tracking_enabled);
    },
    error: function(xhr, status, error) {
        console.error(error);
        alert('An error occurred: ' + error);
    }
});


뷰에서 JSON 데이터 처리

이제 데이터가 JSON 형식으로 올바르게 전송되었다면, Django 뷰에서도 이를 처리해야 했다. `request.POST`가 아닌 `request.body`를 통해 데이터를 읽어야 하므로, 뷰 코드를 다음과 같이 수정했다.

# views.py
import json
from django.http import JsonResponse
from django.views.decorators.http import require_POST

@require_POST
def update_tracking(request):
    try:
        data = json.loads(request.body)  # JSON 데이터 로드
        tracking_enabled = data.get('tracking_enabled', False)

        # tracking_enabled 값을 저장하는 로직을 추가해야 한다
        # 예: UserProfile.objects.filter(user=request.user).update(tracking_enabled=tracking_enabled)

        return JsonResponse({'status': 'success', 'tracking_enabled': tracking_enabled})
    except json.JSONDecodeError:
        return JsonResponse({'status': 'error', 'message': 'Invalid JSON'}, status=400)


만약 여전히 문제가 발생한다면, 브라우저의 개발자 도구(예: F12)를 사용하여 AJAX 요청의 네트워크 탭을 확인하고 요청 데이터와 응답을 검토해봐야 한다.


장고 리스트