es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Por qué DRF IsAuthenticatedOrReadOnly permiso de clase permite el método Post?

Estoy realizando pruebas en el marco de trabajo de Django rest, aquí está mi vista,

clase PostList(generics.ListCreateAPIView):
permission_classes = [IsAuthenticatedOrReadOnly,]
queryset = Post.postobjects.all()
serializer_class = PostSerializer

El patrón de URL es como sigue,

urlpatterns = [
path(‘/’,PostDetail.as_view(),name=”detailcreate”),
path(”,PostList.as_view(),name=”listcreate”),
]

Aquí está mi prueba:

def create_post(self):
self.test_category = Category.objects.create(category=’django’)
self.test_user = User.objects.create_user(user_name=”test_user”,password=”123456789″)
data = {“title”: “new”, “author”: 1,
“excerpt”: “new”, “content”: “new”}
url = reverse(‘api:listcreate’)
response = self.client.post(url, data, format=’json’)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

He ejecutado el siguiente comando:

cobertura correr –omit=’/myvenv/‘ manage.py test

y obtener una salida:

Ran 1 test in 0.215s
OK

En mi entendimiento, como la clase de permiso es [IsAuthenticatedOrReadOnly,], self.client no debería tener permiso para publicar y la prueba debería fallar. No entiendo lo que me falta aquí. Lo intenté con permiso [IsAuthenticated,] y la prueba falló, pero al usar el permiso [IsAuthenticatedOrReadOnly,] la prueba no falla.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en pruebas de Django Rest Framework, puedo ver que las clases de permisos utilizadas en la vista son [IsAuthenticatedOrReadOnly,]. La clase de permisos IsAuthenticatedOrReadOnly permite solicitudes POST de usuarios autenticados y solicitudes GET de cualquier usuario. Sin embargo, en el caso de prueba, el usuario no está autenticado, pero la prueba está pasando, lo que parece ser una contradicción.

    La posible razón por la que la prueba pasa incluso si el usuario no está autenticado es que la autenticación del usuario no es necesaria para que la vista cree una publicación. Por lo tanto, la vista crea correctamente una publicación y la prueba pasa.

    Para probar si las clases de permisos funcionan correctamente, podemos modificar el caso de prueba para utilizar un usuario autenticado mediante la opción force_authenticate disponible en APIClient de Django Rest Framework.

    Aquí tiene un ejemplo de cómo modificar el caso de prueba para utilizar un usuario autenticado:

     def create_post(self):
            self.test_category = Categoria.objects.create(categoria='django')
    
            self.test_user = User.objects.create_user(username="test_user",password="123456789")
            self.client.force_authenticate(user=self.test_user)
            data = {"title": "nuevo", "author": 1, "excerpt": "nuevo", "content": "nuevo"}
            url = reverse('api:listcreate')
            response = self.client.post(url, data, format='json')
            self.assertEqual(response.status_code, status.HTTP_201_CREATED)
    

    Con la modificación anterior, el caso de prueba utilizará el objeto test_user para autenticar la solicitud y la vista permitirá al usuario crear una publicación. Si las clases de permisos funcionan correctamente, el caso de prueba debería aprobarse, y si las clases de permisos no funcionan correctamente, el caso de prueba debería fallar.

Comments are closed.