Consideraciones: Uso los comandos python3
y pip3
por que es como lo tengo configurado en mi sistema. Cada uno tendrá que saber cuál utilizar (python
vs. python3
/ pip
vs. pip3
) según el entorno de cada uno.
Clonar el repositorio
git clone [email protected]:PIALARA/pia-lara.git
Dentro del directorio del repositorio, crear el entorno virtual:
python3 -m venv venv
Y activar el entorno virtual (aquí ya cada uno según windows, linux o Mac tendrá que seguir el procedimiento que se explicó en clase), por ejemplo, para Linux/Mac haríamos:
source venv/bin/activate
Nota: El directorio venv
está puesto en el .gitignore
para que no se suba al repositorio. Si lo llamáis de otra forma, agregadlo al .gitignore
Instalamos los requerimientos
pip3 install -r requirements.txt
Nota: Si cuando actualicemos master tenemos actualizaciones en los requerimientos, hay que actualizarlos:
pip3 install --upgrade --force-reinstall -r requirements.txt
Y finalmente ejecutamos Flask:
flask --app pialara --debug run
Para ejecutar las migraciones, una vez activado el entorno virtual, desde el raíz, ejecutaremos el script adecuado:
python3 migrations/sylabus_migration.py
En el raíz del repositorio tenemos el archivo .ini.sample
, el cual debemos renombrar a .ini
y configurar las variables de entorno:
[PROD]
SECRET_KEY = eac5e91171438960ddec0c9c469a4c3dd42e96aea462afc5ab830f78527ad80e
PIALARA_DB_URI = mongodb+srv://usuario:contraseña@host
PIALARA_DB_NAME = pialara
[LOCAL]
SECRET_KEY = eac5e91171438960ddec0c9c469a4c3dd42e96aea462afc5ab830f78527ad80e
PIALARA_DB_URI = localhost
PIALARA_DB_NAME = pialara
aws_access_key_id=clave_aws
aws_secret_access_key=secret_aws
aws_session_token=token_aws
!!! caution "Cuidado" Revisar versión de Python y librería BSON. PyMongo instala su propia versión de BSON que evita los errores.
El código principal de la aplicación está en el directorio pialara
.
En el directorio blueprints se van a agrupar las funcionalidades para tenerlo todo separado. Por ejemplo, auth tendrá su blueprint, syllabus (frases) tendrá su blueprint, etc.
Cuando se crea un blueprint, es necesario agregarlo en __init__.py
para que la aplicación lo cargue.
Cada Blueprint va a tener asociado un directorio con su mismo nombre dentro del directorio templates que contendrá sus vistas.
Por ejemplo, el Blueprint auth va a tener el directorio templates/auth
para guardar sus vistas.
Se van a usar modelos para acceder a la base de datos. Cada modelo representa a una colección y tiene que extender de la clase base que se ha creado MongoModel
. Un ejemplo de implementación para crear un modelo que va a acceder a las colecciones de Usuario sería:
from pialara.models.MongoModel import MongoModel
class Usuario(MongoModel):
collection_name = 'users'
Es necesario hacer override de la propiedad collection_name y asignarle una cadena con el nombre de la colección.
Una vez tenemos el modelo creado, lo podemos instanciar de la siguiente manera:
u = Usuario()
Con esto, tendríamos todos los métodos que se han heredado de MongoModel a nuestra disposición sin tener que haberlos implementado. Por ejemplo, podríamos recuperar todos los usuarios con:
db.users.find()
Los métodos de MongoModel no son más que wrappers de los ofrecidos por la librería PyMongo. Es decir, el método user.find(...parametros...)
sería lo mismo que hacer db.users.find(...parametros...)
find(self, params=None)
update_one(self, mongo_filter, new_values, upsert=False)
update_many(self, mongo_filter, new_values, upsert=False)
insert_one(self, values)
insert_many(self, values)
Ejemplo para insertar un documento
u.insert_one({ "nombre": "Test", "email": "[email protected]" })
Ejemplo para insertar multiples documentos
u.insert_many([{ "nombre": "Test", "email": "[email protected]" },{ "nombre": "Test", "email": "[email protected]" }])
Ejemplo para actualizar un documento
u.update_one({"email":"[email protected]"}, { "$set": {"nombre": "Test33"}})
Ejemplo para actualizar un documento y si no existe lo crea
u.update_one({"email":"[email protected]"}, { "$set": {"nombre": "Test33"}}, upsert=True)
Ejemplo para actualizar multiples documentos
u.update_many({"nombre": "Test"}, { "$set": {"email":"[email protected]"}})
Ejemplo para actualizar multiples documentos y si no existen los crea
u.update_many({"nombre": "Test"}, { "$set": {"email":"[email protected]"}}, upsert=True)
Se ha creado un decorador en el fichero decorators.py para poder usarlo y asi comprobar que el usuario esta logueado y tiene un rol determinado
Su uso sería para comprobar que tiene el rol admin
para la ruta /profile
seria:
from pialara.decorators import rol_required
@bp.route('/profile')
@rol_required("admin")
def profile():
return render_template('auth/profile.html')