Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
python:flask:configuration [2021/09/02 04:45] marclebrun |
python:flask:configuration [2021/09/22 17:03] (Version actuelle) |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
Doc: [[https://flask.palletsprojects.com/en/2.0.x/config/]] | Doc: [[https://flask.palletsprojects.com/en/2.0.x/config/]] | ||
- | ===== Configurer son application ===== | + | ===== Structure du projet ===== |
- | Juste après la création de l'objet **app**, charger le contenu de | + | Les fichiers **.env** et **config.py** sont positionnées à la racine |
- | l'un ou l'autre fichier **.py** en fonction de l'environnement : | + | du projet : |
- | <code python> | + | <code> |
- | app = Flask(__name__) | + | /home/marc/flaskapp |
- | + | ├── .env | |
- | if app.config['env'] == 'development': | + | ├── app |
- | app.config.from_object('config_dev') | + | │ ├── __init__.py |
- | + | │ └── ... | |
- | if app.config['env'] == 'production': | + | ├── config.py |
- | app.config.from_object('config_prod') | + | └── ... |
</code> | </code> | ||
- | Les deux fichiers sont situés à la racine de l'application. | + | :!: Les fichiers **.env** et **config.py** doivent être dans le **.gitignore** |
+ | sinon ils seront publiés sur le dépôt en même temps que le code :!: | ||
- | <code python config_prod.py> | + | ===== Installation des dépendances ===== |
- | import os | + | |
- | DEBUG = True | + | Pour charger le fichier **.env**, il faut que le module **python-dotenv** |
+ | soit installé. | ||
- | BASE_DIR = os.path.abspath(os.path.dirname(__file__)) | + | <code bash> |
- | DBPATH = os.path.join(BASE_DIR, 'data/example.db') | + | source venv/bin/activate |
- | + | (venv)$ pip install python-dotenv | |
- | SECRET_KEY = "... clé secrète pour le développement ..." | + | |
</code> | </code> | ||
- | <code python config_dev.py> | + | ===== Écrire le fichier .env ===== |
- | import os | + | |
- | DEBUG = False | + | Contient la configuration de base de **Flask** |
- | BASE_DIR = os.path.abspath(os.path.dirname(__file__)) | + | En **développement** : |
- | DBPATH = '/var/data/production.db' | + | |
- | SECRET_KEY = "... clé secrète pour la production ..." | + | <code bash .env> |
+ | FLASK_APP = run.py | ||
+ | FLASK_ENV = development | ||
+ | DEBUG = True | ||
</code> | </code> | ||
- | ===== Utiliser un fichier .env ===== | + | En **production** : |
- | Installer **python-dotenv** dans le Virtual Environment : | + | <code bash .env> |
- | + | FLASK_ENV = production | |
- | <code bash> | + | DEBUG = False |
- | source venv/bin/activate | + | |
- | (venv)$ pip install python-dotenv | + | |
</code> | </code> | ||
- | Créer un fichier **.env** à la racine du projet : | + | ===== Écrire le fichier config.py ===== |
- | <code> | + | C'est ici que je place toute la configuration spécifique à l'application |
- | /home/marc/flaskapp | + | (qui n'est pas propre à Flask). |
- | ├── app | + | |
- | │ ├── __init__.py | + | |
- | │ └── ... | + | |
- | └── .env | + | |
- | </code> | + | |
- | :!: Le fichier **.env** doit être dans le **.gitignore** sinon il sera publié | + | <code python config.py> |
- | sur GitHub en même temps que le code :!: | + | import os |
- | <code bash /home/marc/flaskapp/.env> | + | SECRET_KEY = "...(clé secrète)..." |
- | FLASK_ENV=development | + | |
- | PGUSER=marc | + | BASE_DIR = os.path.abspath(os.path.dirname(__file__)) |
- | PGPASSWORD=my_password | + | PATH_UPLOAD = os.path.join(BASE_DIR, 'data/upload/') |
</code> | </code> | ||
- | **Flask** va détecter la présence du fichier **.env** et charger | + | Pour générer la clé secrète, voir la page [[python:generer_secret_key]] |
- | certaines valeurs depuis celui-ci (par exemple **FLASK_ENV**). | + | |
- | Pour le reste, charger les variables d'environnement lors de | + | ===== Lecture de la configuration ===== |
- | l'initialisation de l'application : | + | |
- | <code python __init__.py> | + | Les valeurs lues par **Flask** depuis le fichier **.env** se trouvent déjà |
- | import os | + | dans l'objet **app.config** |
- | from flask import Flask, ... | + | |
- | from dotenv import load_dotenv | + | |
- | ... | + | Nous allons y intégrer les valeurs lues depuis le fichier **config.py** : |
+ | |||
+ | <code python __init.py__> | ||
+ | from flask import Flask | ||
app = Flask(__name__) | app = Flask(__name__) | ||
- | base_dir = os.path.dirname(app.root_path) | + | # ceci va intégrer les valeurs de "config.py" |
- | load_dotenv(os.path.join(base_dir, '.env')) | + | app.config.from_object('config') |
</code> | </code> | ||
- | Ensuite il suffit de les utiliser dans le code de cette façon : | + | ===== Accéder à la configuration ===== |
<code python> | <code python> | ||
- | import os | + | base_dir = app.config['BASE_DIR'] |
+ | </code> | ||
+ | |||
+ | Depuis un Blueprint, utiliser l'objet **current_app** : | ||
+ | |||
+ | <code python> | ||
+ | from flask import current_app | ||
- | username = os.getenv('PGUSER') | + | base_dir = current_app.config['BASE_DIR'] |
- | password = os.getenv('PGPASSWORD') | + | |
</code> | </code> | ||
- | ===== Générer une Secret Key ===== | + | ===== Afficher le contenu de la configuration ===== |
- | Voir la page [[python:generer_secret_key]] | + | Ceci sort la liste des valeurs vers la console: |
+ | <code python> | ||
+ | for item in app.config.items(): | ||
+ | print("%-30s => %s" % item) | ||
+ | </code> | ||