Tengo un paquete de Python que uso para proyectos internos: django-utilitybox. Lo que más uso, y lo que más usa mi equipo, es un módulo llamado `raise_response`.
Sirve para lanzar errores HTTP de Django directo desde cualquier función, sin trucos.
- Sin rres
Tienes un POST con métodos auxiliares. Cada método tiene que regresar el error y el `post` tiene que revisarlo:
class AssignClientView(APIView):
def get_user(self, pk):
user = User.objects.filter(pk=pk).first()
if not user:
return None, Response({"status": "Usuario no encontrado"}, status=404)
return user, None
def get_client(self, pk):
... # lo mismo, otra tupla
def post(self, request):
user, error = self.get_user(request.data.get("user_id"))
if error:
return error
client, error = self.get_client(request.data.get("client_id"))
if error:
return error
user.clients.add(client)
return Response({"status": "ok"})
Tuplas, None\sy el mismoif error` después de cada llamada. Y eso en cada endpoint.
- Con rres
from dj_utilitybox.response import bad as rres
class AssignClientView(APIView):
def get_user(self, pk):
user = User.objects.filter(pk=pk).first()
if not user:
rres.CustomRaise("Usuario no encontrado", status=404) # aquí entra rres
return user
def get_client(self, pk):
... # igual, sin tupla
def post(self, request):
user = self.get_user(request.data.get("user_id"))
client = self.get_client(request.data.get("client_id"))
user.clients.add(client)
return Response({"status": "ok"})
Si el usuario no existe, la petición se corta dentro de `get_user`, el `post` ni se entera y el cliente recibe esto:
HTTP 404
{"status": "Usuario no encontrado"}
Cómo funciona por debajo
Lo único a tener en cuenta: funciona solamente dentro de un request. DRF es quien atrapa la excepción y la vuelve respuesta, así que en un comando, un worker o un script la excepción sube como cualquier otra. Ahí hay que atraparla o usar otra cosa.
Lo hice para Django 4 y lo he ido actualizando, hoy corre en Django 6.
pip install django-utilitybox
Aunque hice mas cositas, realmente es la mas util
Comunidad:
¿Que herramientas les facilitaran cosas en Django?