본문 바로가기

Python/Django

Django: HTTP DELETE Method # HTTP # DELETE, PUT # GET, POST

728x90
반응형

Django에서 HTTP request는 내장기능으로 GET, POST만 지원하고

DELETE, PUT은 지원하지 않는다.

print(dir(request))

위와 같이 찍어보면

['COOKIES', 'FILES', 'GET', 'LANGUAGE_CODE', 'META', 'POST', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_current_scheme_host', '_encoding', '_get_full_path', '_get_post', '_get_raw_host', '_get_scheme', '_initialize_handlers', '_load_post_and_files', '_mark_post_parse_error', '_messages', '_read_started', '_set_content_type_params', '_set_post', '_stream', '_upload_handlers', 'accepted_types', 'accepts', 'body', 'build_absolute_uri', 'close', 'content_params', 'content_type', 'csrf_processing_done', 'encoding', 'environ', 'get_full_path', 'get_full_path_info', 'get_host', 'get_port', 'get_signed_cookie', 'headers', 'is_secure', 'method', 'parse_file_upload', 'path', 'path_info', 'read', 'readline', 'readlines', 'resolver_match', 'scheme', 'session', 'upload_handlers', 'user']

GET, POST만 있고, COOKIES, FILES 등이 있지만

DELETE, PUT은 존재 하지 않는다.

 

기본 내장 기능이 DELETE, PUT을 지원하지 않을 뿐이지, 이용할 방법이 있긴 하다.

 

위 내용을 보면 'method' 가 있다.

아래와 같이 front 에서 ajax를 통해 DELETE method를 통해 데이터를 보냈을 때

request.method를 통해 어떤 method로 들어왔는지 확인 가능하다

 

Javascript, Ajax

function delete_some() {
    const somes = document.querySelectorAll(".somes");
    const checkedSomes = Array.from(repos).filter(box => box.checked).map(box => box.getAttribute('some_id'));

    $.ajax({
        url: `${window.location.pathname}/delete/some`
        ,method: 'DELETE'
        ,data: JSON.stringify({"some_id_list": checkedSomes})
        ,async: true
        ,success: function (data) {
            console.log(data);
        }
    });
}

 

Python, Django

def delete_group_repo(request, group_id):
    print(request.method)
    body_unicode=request.body.decode('utf-8') 	# binary 형태의 data decode
    body_data = json.loads(body_unicode)
    print(body_data)
    for i in body_data.get('some_id_list'):
        print(i)
    return JsonResponse({"status":"success"})

Result

DELETE
{'some_id_list': ['8', '9']}
8
9

 

* POST에서 payload에 list를 담아서 보내는 경우,

{"some_id_list":JSON.stringify(chekedSomes))} 와 같이

Object 전체가 아니라 value 값에만 JSON.stringfiy()를 입혀서

Django 단에서 body_unicode를 print하면 다음과 같이 나와서 데이터 처리가 불가능해진다.

some_id_list=%5B%5D

 

728x90
반응형