🔧 Django에서 HTML 폼으로 DELETE 요청 처리하기 — Middleware 활용법

2025. 5. 14. 14:08·기술블로그-Django편

🔧 Django에서 HTML 폼으로 DELETE 요청 처리하기 — Middleware 활용법


✅ 문제 상황

HTML 폼(<form>)은 GET과 POST 메서드만 지원합니다. 그러나 RESTful 원칙에 따르면, 삭제 작업은 DELETE 메서드를 사용하는 것이 적절합니다.

즉, HTML 폼으로는 다음과 같은 코드는 작동하지 않습니다:

<form method="DELETE">  <!-- ❌ 동작하지 않음 -->

✅ 해결 방법 1: POST 방식 + 숨은 필드 우회

HTML에서는 method="POST"로 고정한 뒤, 숨은 필드로 원하는 메서드를 명시합니다.

📌 HTML 예시

<form action="/shorten/{{ code }}/" method="POST">
  {% csrf_token %}
  <input type="hidden" name="_method" value="DELETE">
  <button type="submit">삭제</button>
</form>

📌 View 처리 예시

if request.method == "POST" and request.POST.get('_method') == "DELETE":
    # 삭제 처리
    obj = get_object_or_404(MyModel, pk=pk)
    obj.delete()
    return redirect("/")

이 방식은 단순하고 빠르지만, view마다 _method를 직접 확인해야 하므로 중복 코드가 생깁니다.


✅ 해결 방법 2: Middleware로 자동 처리

숨은 필드를 통해 전달된 _method 값을 기반으로, 요청 메서드를 강제로 변경하는 미들웨어를 설정하면 view에서는 신경 쓸 필요가 없습니다.

📌 Middleware 코드 예시 (middleware/http_method_override.py)

class MethodOverrideMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.method == "POST":
            override_method = request.POST.get("_method")
            if override_method:
                request.method = override_method.upper()
                request._load_post_and_files()
                request.META["REQUEST_METHOD"] = override_method.upper()
        return self.get_response(request)

📌 settings.py에 등록

MIDDLEWARE = [
    # ...
    'yourproject.middleware.http_method_override.MethodOverrideMiddleware',
    # ...
]

✅ Middleware가 뭐길래?

Middleware는 Django의 HTTP 요청/응답 흐름을 가로채서 특정 로직을 선처리(pre-processing)하거나 후처리(post-processing)할 수 있는 훅(hook)입니다.

기능 예시

요청 조작 요청 메서드 바꾸기, 사용자 인증 체크 등
응답 가공 응답 헤더 추가, 로깅 처리 등

✅ 실전 팁

  • 이 미들웨어는 PUT, PATCH도 함께 처리할 수 있도록 확장 가능합니다.
  • CSRF 보호는 그대로 유지되므로 보안 문제는 없습니다.
  • JavaScript 없이도 RESTful한 구조를 유지할 수 있다는 장점이 있습니다.

✅ 요약

방법 특징

POST + _method 간단하지만 view마다 분기 필요
Middleware 방식 전역 처리 가능, view는 원래처럼 작성 가능

Django 프로젝트에서 RESTful 구조를 유지하면서 HTML 폼만으로 DELETE 요청을 구현하고 싶을 때 매우 유용한 패턴입니다 ✅

'기술블로그-Django편' 카테고리의 다른 글

🔍 Django ORM Field Lookups 완벽 정리  (0) 2025.05.14
🔍 Django ORM: get() vs filter() 차이점 완벽 정리  (0) 2025.05.14
🔄 Django에서 access_count += 1 vs F("access_count") + 1 완전 비교  (0) 2025.05.14
[Django 3일차] Django에서의 요청(request)과 뷰(view)의 모든 것 1/4 (short_url 프로젝트)(250514)  (0) 2025.05.14
🔍 Django에서 Model.objects.get(code=code)가 뭔 뜻이야?  (0) 2025.05.14
'기술블로그-Django편' 카테고리의 다른 글
  • 🔍 Django ORM Field Lookups 완벽 정리
  • 🔍 Django ORM: get() vs filter() 차이점 완벽 정리
  • 🔄 Django에서 access_count += 1 vs F("access_count") + 1 완전 비교
  • [Django 3일차] Django에서의 요청(request)과 뷰(view)의 모든 것 1/4 (short_url 프로젝트)(250514)
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (702)
      • Python (32)
      • 프로젝트 (43)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (40)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
🔧 Django에서 HTML 폼으로 DELETE 요청 처리하기 — Middleware 활용법
상단으로

티스토리툴바