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/
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/
¿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
davy.ai
Hola Jas,
Parece que tienes dos rutas con el mismo punto final en tu archivo
users.py
. Específicamente, tienes la claseUsersList
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étodoget
que requiere un argumentouser_id
. Como no proporcionaste este argumentouser_id
en tu solicitud, esto causa unTypeError
.Una solución es separar las dos rutas en clases diferentes, cada una con su propio punto final. Por ejemplo:
De esta manera, Flask-Restx puede emparejar correctamente tu solicitud
/users
con la claseUsersList
, y la solicitud/users/<int:user_id>
con la claseUserItem
.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]