← Назад к вопросам

Когда используется DELETE HTTP запрос?

2.0 Middle🔥 171 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Когда используется DELETE HTTP запрос

HTTP метод DELETE используется для удаления ресурса на сервере. Это один из основных RESTful методов и играет важную роль в проектировании современных веб-приложений и API.

Основное назначение DELETE

DELETE — это HTTP метод для удаления ресурса, идентифицируемого URI:

DELETE /api/v1/users/123
DELETE /api/v1/posts/abc123
DELETE /api/v1/comments/456/reply/789

DELETE vs другие HTTP методы

МетодНазначениеИдемпотентность
GETПолучить ресурсДа
POSTСоздать новыйНет
PUTЗаменить весьДа
PATCHЧастично обновитьНет
DELETEУдалить ресурсДа

Примеры сценариев

Удаление пользователя:

DELETE /api/v1/users/f67556b8-54c9-4971-96ea-4fdefb25afd8

Удаление комментария:

DELETE /api/v1/posts/123/comments/456

Удаление лайка:

DELETE /api/v1/posts/123/likes

Реализация DELETE в FastAPI

from fastapi import FastAPI, HTTPException
from sqlalchemy.orm import Session

app = FastAPI()

@app.delete("/api/v1/users/{user_id}")
def delete_user(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    
    if not user:
        raise HTTPException(status_code=404, detail="User not found")
    
    db.delete(user)
    db.commit()
    
    return {"message": "User deleted successfully"}

Реализация DELETE в Django

from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
@require_http_methods(["DELETE"])
def delete_post(request, post_id):
    try:
        post = Post.objects.get(id=post_id)
        post.delete()
        return JsonResponse({"message": "Post deleted"}, status=204)
    except Post.DoesNotExist:
        return JsonResponse({"error": "Not found"}, status=404)

Class-Based Views в Django

from django.views import View
from django.http import JsonResponse

class DeletePostView(View):
    def delete(self, request, post_id):
        try:
            post = Post.objects.get(id=post_id)
            post.delete()
            return JsonResponse({"message": "Post deleted"}, status=204)
        except Post.DoesNotExist:
            return JsonResponse({"error": "Not found"}, status=404)

HTTP статусы при DELETE

СтатусЗначение
204 No ContentУспешно удалено, нет содержимого (рекомендуется)
200 OKУспешно удалено, есть тело ответа
202 AcceptedЗапрос на обработку (асинхронное удаление)
404 Not FoundРесурс не найден
401 UnauthorizedТребуется аутентификация
403 ForbiddenНет прав доступа
410 GoneРесурс уже удален

Идемпотентность DELETE

DELETE является идемпотентным методом — повторный DELETE на один ресурс не должен вызывать ошибку:

# Первый DELETE — успешно удаляет (204)
DELETE /api/v1/users/123

# Второй DELETE — должен вернуть 204 или 404
DELETE /api/v1/users/123

Безопасность и лучшие практики

Требуй аутентификацию и авторизацию:

@app.delete("/api/v1/posts/{post_id}")
async def delete_post(
    post_id: int,
    current_user: User = Depends(get_current_user),
    db: Session = Depends(get_db)
):
    post = db.query(Post).filter(Post.id == post_id).first()
    
    if not post:
        raise HTTPException(status_code=404)
    
    if post.user_id != current_user.id:
        raise HTTPException(status_code=403, detail="Not authorized")
    
    db.delete(post)
    db.commit()

Soft delete вместо hard delete:

from datetime import datetime

@app.delete("/api/v1/posts/{post_id}")
async def delete_post(post_id: int, db: Session = Depends(get_db)):
    post = db.query(Post).filter(Post.id == post_id).first()
    
    if not post:
        raise HTTPException(status_code=404)
    
    # Soft delete — помечаем как удалённый
    post.deleted_at = datetime.utcnow()
    db.commit()
    
    return {"status": "deleted"}

Bulk удаление

@app.delete("/api/v1/users/bulk")
async def delete_users_bulk(user_ids: list[int], db: Session = Depends(get_db)):
    db.query(User).filter(User.id.in_(user_ids)).delete()
    db.commit()
    return {"deleted_count": len(user_ids)}

Тестирование DELETE

import requests

# Удаление одного ресурса
response = requests.delete("http://api.example.com/api/v1/users/123")
assert response.status_code == 204

# Повторное удаление (идемпотентность)
response = requests.delete("http://api.example.com/api/v1/users/123")
assert response.status_code in (204, 404)

DELETE метод — это стандартный способ удаления ресурсов в RESTful API и должен использоваться для всех операций удаления.