simple - ¿Cómo devolver un objeto rest_framework.response desde una clase de middleware personalizada de django?
django rest framework tutorial (2)
Recientemente he encontrado este problema. Esta solución no utiliza la respuesta del marco de Django Rest, pero si su servidor simplemente devuelve JSON, esta solución podría funcionar para usted.
Nuevo en django 1.7 es el tipo de respuesta JSONResponse.
https://docs.djangoproject.com/en/1.7/ref/request-response/#jsonresponse-objects
En el middleware puede devolver estas respuestas sin tener todos los errores "No se aceptan representadores" y "La respuesta no tiene codificación de atributo".
Es un formato muy similar al DRF Response.
La importación es la siguiente: from django.http import JsonResponse
Y como lo usas:
return JsonResponse({''error'': ''Some error''}, status=401)
¡Espero que esto te ayude!
Estoy tratando de escribir una clase de middleware que garantice que el usuario haya iniciado sesión. Pero el problema es que esta clase de middleware solo será aplicable a un pequeño conjunto de vistas y estas vistas devuelven un objeto Response
de DRF en lugar del objeto HTTPResponse
y estas vistas También se decoran utilizando api_view
.
Entonces, cuando intento devolver un objeto de respuesta de la clase de software intermedio, se genera este error.
assert renderer, ".accepted_renderer not set on Response"
AssertionError: .accepted_renderer not set on Response
He buscado un poco en SO y creo que el error está relacionado de alguna manera con el decorador api_view
. Pero estoy confundido sobre cómo resolver este problema.
Cualquier ayuda es apreciada. :)
Resolví esto yo mismo imitando cómo las vistas de los marcos de descanso remendan el objeto de respuesta con accepted_renderer
, renderer_context
y renderer_context
. En mi caso, solo quería devolver una respuesta 401 usando la clase de Response
marcos de descanso, en parte porque mis pruebas esperan una respuesta del marco de descanso cuando llamo self.client.get(...)
y afirmo response.data
.
Es posible que otros casos de uso requieran que proporcione información adicional en el renderer_context
o que use un redistribuidor accepted_renderer
.
from rest_framework import status
from rest_framework.renderers import JSONRenderer
from rest_framework.response import Response
class MiddlewareClass(object):
def __init__(self, get_response):
self.get_response = get_response
def unauthorized_response(self, request):
response = Response(
{"detail": "This action is not authorized"},
content_type="application/json",
status=status.HTTP_401_UNAUTHORIZED,
)
response.accepted_renderer = JSONRenderer()
response.accepted_media_type = "application/json"
response.renderer_context = {}
return response
def __call__(self, request: HttpRequest):
if not self.authorized(request):
return self.unauthorized_response(request)
return self.get_response(request)