← Назад к вопросам
Когда используется 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 и должен использоваться для всех операций удаления.