2
respostas

[Dúvida] Minha API não está armazenando as matriculas em cache

Após criar uma nova matrícula e fazer o POST, aparece a matrícula que acabei de cadastrar:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Mas ao voltar para tela de matrículas, aparecem todas matrículas e não apenas aquela que deveria ser salva em cache:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Segue meu views.py:

from rest_framework import viewsets, generics, status
from escola.models import Aluno, Curso, Matricula
from escola.serializer import (AlunoSerializer, CursoSerializer, MatriculaSerializer,
                               ListaMatriculasAlunoSerializer, ListaAlunosMatriculadosSerializer,
                               AlunoSerializerV2)
from rest_framework.response import Response
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page

class AlunosViewSet(viewsets.ModelViewSet):
    """Exibindo todos os alunos e alunas"""
    queryset = Aluno.objects.all()

    def get_serializer_class(self):
        if self.request.version == 'v2':
            return AlunoSerializerV2
        else:
            return AlunoSerializer

class CursosViewSet(viewsets.ModelViewSet):
    """Exibindo todos os cursos"""
    queryset = Curso.objects.all()
    serializer_class = CursoSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            serializer.save()
            response = Response(serializer.data, status=status.HTTP_201_CREATED)
            obj_id = str(serializer.data['id'])
            response['Location'] = request.build_absolute_uri() + obj_id
            return response


class MatriculaViewSet(viewsets.ModelViewSet):
    """Listando todas as matrículas"""
    queryset = Matricula.objects.all()
    serializer_class = MatriculaSerializer
    http_method_names = ['get', 'post', 'put', 'path']

    @method_decorator(cache_page(120))
    def dispatch(self, *args, **kwargs):
        return super(MatriculaViewSet, self).dispatch(*args, **kwargs)


class ListaMatriculasAluno(generics.ListAPIView):
    """Listando as matrículas de um aluno ou aluna"""
    def get_queryset(self):
        queryset = Matricula.objects.filter(aluno_id=self.kwargs['pk'])
        return queryset
    serializer_class = ListaMatriculasAlunoSerializer

class ListaAlunosMatriculados(generics.ListAPIView):
    """Listando alunos e alunas matriculados em um curso"""
    def get_queryset(self):
        queryset = Matricula.objects.filter(curso_id=self.kwargs['pk'])
        return queryset
    serializer_class = ListaAlunosMatriculadosSerializer

E o trecho de código referente em settings.py:

# Código omitido

REST_FRAMEWORK = {
 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.QueryParameterVersioning',
 'DEFAULT_PERMISSIONS_CLASSES': [
     'rest_framework.permissions.IsAuthenticated',
     'rest_framework.permissions.DjangoModelPermissions'
 ],
 'DEFAULT_AUTHENTICATION_CLASSES': [
     'rest_framework.authentication.BasicAuthentication',
 ],
 'DEFAULT_THROTTLE_CLASSES': [
     'rest_framework.throttling.AnonRateThrottle',

 ],
 'DEFAULT_THROTTLE_RATES': {
     'anon': '50/day',
 }
}

CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",
]

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

SESSION_CACHE_ALIAS = 'default'
2 respostas

Olá Igor

Analisando o código que você compartilhou, percebi que você está utilizando a biblioteca django-redis para fazer a conexão entre o Django e o Redis.

No entanto, parece que você esqueceu de adicionar a configuração de cache em seu arquivo settings.py. É importante configurar corretamente o cache para que as matrículas sejam armazenadas corretamente.

Aqui está a configuração que você pode adicionar em seu arquivo settings.py:

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

Certifique-se de que você tenha o Redis instalado e em execução em sua máquina. Além disso, verifique se você importou corretamente as bibliotecas necessárias em seu arquivo views.py.

Após adicionar essa configuração, reinicie seu servidor Django e teste novamente. As matrículas devem ser armazenadas corretamente em cache.

Desculpe, mas conforme meu código acima, eu havia adicionado a configuração de cache em settings.py!