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.

Desarrollo dirigido por pruebas con FastAPI y Docker: Las rutas de prueba no funcionan juntas.

Estoy siguiendo el curso de testdriven.io.

He encontrado que al agregar la ruta GET para todos los usuarios no funciona ya que la solicitud espera un user id.

En el archivo users.py tengo:

@api.marshal_with(user, as_list=True)
def get(self):
    return User.query.all(), 200

y

@api.marshal_with(user)
def get(self, user_id):
     ...

y luego tengo

api.add_resource(UsersList, '/users')
api.add_resource(UsersList, '/users/<int:user_id>')

Parece que al incluir la ruta ‘/users/‘ la ruta ‘/users’ falla con:

src/tests/test_users.py::test_all_users – TypeError: get() missing 1 required positional argument: ‘user_id’

Si comento la ruta api.add_resource(UsersList, ‘/users/‘) entonces la ruta de todos los usuarios funciona bien.

¿Hay alguna manera de permitir que ambas rutas (todos los usuarios y usuario por id) funcionen?

¿Puedo hacer algo similar en otros frameworks como Lumen (PHP) por lo que posiblemente me falte algo obvio?

Gracias,

Jas

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hola Jas,

    Parece que tienes dos rutas con el mismo punto final en tu archivo users.py. Específicamente, tienes la clase UsersList asignada tanto a las rutas /users como /users/<int:user_id>. Flask-Restx utiliza estas rutas para emparejar la solicitud entrante con el método apropiado en la clase.

    Cuando envías una solicitud GET a /users, Flask-Restx la empareja con el método get que requiere un argumento user_id. Como no proporcionaste este argumento user_id en tu solicitud, esto causa un TypeError.

    Una solución es separar las dos rutas en clases diferentes, cada una con su propio punto final. Por ejemplo:

    class UsersList(Resource):
        @api.marshal_with(user, as_list=True)  
        def get(self):  
            return User.query.all(), 200
    
    class UserItem(Resource):
        @api.marshal_with(user)  
        def get(self, user_id):
            ...
    
    api.add_resource(UsersList, '/users')
    api.add_resource(UserItem, '/users/<int:user_id>')
    

    De esta manera, Flask-Restx puede emparejar correctamente tu solicitud /users con la clase UsersList, y la solicitud /users/<int:user_id> con la clase UserItem.

    En cuanto a otros frameworks como Lumen, deberían tener funcionalidades similares para permitir múltiples rutas con argumentos diferentes.

    Espero que esto te ayude. Avísame si tienes alguna otra pregunta.

    Saludos cordiales,
    [Tu nombre]

Comments are closed.