- Python 3.6 para adelante
- Sistema operativo Unix-like
- Pip
- Clonar el Repositorio
$ git clone https://github.com/erwaen/pizzaTDP.git
- Entrar en el directorio del proyecto
$ cd pizzaTDP
Nota: desde ahora este directorio sera el directorio principal donde se debe ejecutar todos los comandos siguientes.
- Mejor si se crea un entorno virtual
/pizzaTDP $ python3 -m venv env
- Activamos el entorno virtual
/pizzaTDP $ source ./env/bin/activate
- Instalamos las dependencias listadas en requirements.txt con pip
(env) /pizzaTDP $ pip3 install -r requirements.txt
Una vez ya realizado todo lo que esta en la seccion de instalacion, entonces ya deberiamos poder correr el proyecto.
Para correr el proyecto ejecutar:
(env) /pizzaTDP $ uvicorn apiPizza.main:app --reload
INFO: Will watch for changes in these directories: ['/Users/erikwasmosy/Developer/pizzaTDP']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [39834] using watchgod
INFO: Started server process [39836]
INFO: Waiting for application startup.
INFO: Application startup complete.
El proyecto esta alzado 127.0.0.1:8000 .
Para probar rapido que funciona podemos entrar a http://127.0.0.1:8000/docs
Y nos debe salir algo parecido a esto:
š„³ Ya tenemos el proyecto levantado.
- En el repositorio se encuentra el archivo de unna base de datos(pizza_app.db) con datos ya cargdos.
- Para visualizar facilmente los datos que contiene podemos usar algun programa como DB BROWSER for SQLite e importamos el archivo pizza_app.db
La base de datos ya tiene algunos usuarios para probar los endpoints
username | password | is_staff | is_superuser |
---|---|---|---|
normal_user | 12345678 | 0 | 0 |
staff_user | 12345678 | 1 | 0 |
superuser_user | 12345678 | 0 | 1 |
En el directorio raiz del proyecto se encuentra el archivo de la collecion para postman (pizzaApi.postman.json) para importarlo.
Como casi todas las rutas necesitan que este un usuario autenticado, debemos guardar el token JWT como una variable, para eso debemos:
Entonces cuando intentemos usar el request de login/obtener tokens JWT y pasar uno de los usuarios mencionados en la seccion de base de datos, este postman request ya esta configurado para que una vez se haga la peticion en este request ya asigne el access_token en una variable llamada jwt_token.
Para que se asigne automaticamente el access_token en jwt_token se hizo la siguiente configuracion en la peticion:
y vemos que guarda automaticamente el token en la jwt_token del environment que creamos:
Nota: Si queremos testear funciones que solo el rol staff o superstaff puede hacer entonces debemos volver a hacer la peticion para logearse en otra cuenta y asi se cambia el valor de la variable jwt_token con el token del usuario recien logeado.
Con la coleccion dada (./pizzaApi.postman_collection.json) ya esta configurado para que use el token que contiene la variable jwt_token a la hora de verificar la autenticacion.
Si desea probar que pasa sin pasarle la autenticacion entonces en algun request debemos sacar el Authorization que usa.
-
Ej de uso de authorization en una peticion: y vemos que no hay problema a la hora de hacer requests
-
Pero si sacamos el Auth vemos que nos responde con un 401 unauthorized:
NOTA: Algunos endpoints se pasan sus valores como paramentros y otros como Body de tipo row(JSON)
Path | Query | Method | Description |
---|---|---|---|
/logear-jwt | username: str, password: str | POST | Login para autenticacion con JWT, retorna los tokens access_token y refresh_token. |
/signup | body(JSON) { "username": "", password": "" "is_staff": true, "is_superuser": false" } |
POST | Para crear un nuevo usuario y asignarle un rol. |
/pizzas/ | GET | Retorna todas las las pizzas activas con su nombre, precio y numero de ingredientes que tiene. Si el user es staff o superuser entonces tambien retorna las no activas. | |
/pizzas/{pizzaID} | pizzaID: int | GET | Retorna los detalles de la pizza mostrando el nombre, precio, si esta activo o no y sus ingredientes |
/pizzas/ | bodyExample(JSON){ "nombre": "brasilera", "precio": 10000, "is_active": true } |
POST | Crea una nueva pizza dado en el body su nombre, precio y si va a estar activa o no. |
/pizzas/{pizzaID} | nombre: str precio: str is_active: bool |
PATCH | Modifica la pizza con id pizzaID con los valores que se le pasa como parametros |
/ingredientes/ | bodyExample(JSON){ "nombre": "choclo", "categoria" : "basico"/"premium" } |
POST | Para crear un nuevo ingrediente pasandole el body el nombre y la categoria (la categoria se controla que sea solo "basico" o "premium") |
/ingredientes/{ingredienteID} | bodyExample(JSON){ "nombre": "pinha", "categoria" : "basico"/"premium" } |
PATCH | Modifica el ingrediente con id ingredienteID con los valores que se le pasa en el body |
/ingredientes/{ingredienteID/ | DELETE | Elimina un ingrediente de la base de datos y antes controla que ninguna pizza use ese ingrediente | |
/pizza-ingrediente/ | p_id: int ingr_id: int |
POST | Agrega el ingrediente con id ingr_id a la pizza con id p_id |
/pizza-ingrediente/{p_id}/{ingr_id} | DELETE | Elimina un ingrediente con id ingr_id de la pizza con id p_id |