Django - 'AssertionError: .accepted_renderer not set on Response' на конечной точке DRF с Middleware
Итак, я хотел создать Middleware для автоматического добавления аутентификации к каждой конечной точке. Похоже, это создает проблемы для конечных точек Django Rest Framework, использующих декоратор @api_view
. Всякий раз, когда я запускаю свои модульные тесты для нижеприведенной конечной точки, я получаю "AssertionError: .accepted_renderer not set on Response." Как мне исправить это, чтобы мой middlware работал как на классах APIView, так и на конечных точках с декоратором @api_view
?
View.py
@api_view(['GET'])
@swagger_auto_schema(
operation_description="Get <count> most recent posts by category"
)
def get_most_recent_posts_by_category(request, category, count):
return Response(status=status.HTTP_200_OK)
Middleware
from datetime import datetime
from rest_framework import status
from rest_framework.response import Response
from cheers.core.api.jwt_helpers import decode_cognito_jwt
class CognitoMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_view(self, request, view_func, view_args, view_kwargs):
auth = request.headers.get("Authorization", None)
if not auth:
return Response(dict(error='Authorization header expected'), status=status.HTTP_401_UNAUTHORIZED)
parts = auth.split()
if parts[0].lower() != "bearer":
return Response(dict(error='Authorization header must start with bearer'),
status=status.HTTP_401_UNAUTHORIZED)
elif len(parts) == 1:
return Response(dict(error='Token not found'), status=status.HTTP_401_UNAUTHORIZED)
elif len(parts) > 2:
return Response(dict(error='Authorization header must be Bearer token'),
status=status.HTTP_401_UNAUTHORIZED)
token = parts[1]
try:
res = decode_cognito_jwt(token)
expiration = datetime.utcfromtimestamp(res['exp'])
current_utc = datetime.utcnow()
if current_utc > expiration:
return Response(dict(error=f'current time:{current_utc} is after expiration:{expiration}',
user_msg='Please login again'), status=status.HTTP_400_BAD_REQUEST)
except Exception:
# Fail if invalid
return Response(dict(error="Invalid JWT"),
status=status.HTTP_401_UNAUTHORIZED) # Or HttpResponseForbidden()
else:
# Proceed with the view if valid
return None
settings.py
MIDDLEWARE = [
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'cheers.middleware.CognitoMiddleware.CognitoMiddleware'
]