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/14 05:31] marclebrun |
python:flask:configuration [2021/09/22 17:03] (Version actuelle) |
||
---|---|---|---|
Ligne 27: | Ligne 27: | ||
<code bash> | <code bash> | ||
- | pip install python-dotenv | + | source venv/bin/activate |
+ | (venv)$ pip install python-dotenv | ||
</code> | </code> | ||
Ligne 39: | Ligne 40: | ||
FLASK_APP = run.py | FLASK_APP = run.py | ||
FLASK_ENV = development | FLASK_ENV = development | ||
- | + | DEBUG = True | |
- | DEBUG = True | + | |
- | SECRET_KEY = "...(clé secrète)..." | + | |
</code> | </code> | ||
Ligne 48: | Ligne 47: | ||
<code bash .env> | <code bash .env> | ||
FLASK_ENV = production | FLASK_ENV = production | ||
- | + | DEBUG = False | |
- | DEBUG = False | + | |
- | SECRET_KEY = "...(clé secrète)..." | + | |
</code> | </code> | ||
- | |||
- | Pour générer la clé secrète, voir la page [[python:generer_secret_key]] | ||
===== Écrire le fichier config.py ===== | ===== Écrire le fichier config.py ===== | ||
Ligne 62: | Ligne 57: | ||
<code python config.py> | <code python config.py> | ||
import os | import os | ||
+ | |||
+ | SECRET_KEY = "...(clé secrète)..." | ||
BASE_DIR = os.path.abspath(os.path.dirname(__file__)) | BASE_DIR = os.path.abspath(os.path.dirname(__file__)) | ||
Ligne 67: | Ligne 64: | ||
</code> | </code> | ||
+ | Pour générer la clé secrète, voir la page [[python:generer_secret_key]] | ||
+ | ===== Lecture de la configuration ===== | ||
+ | Les valeurs lues par **Flask** depuis le fichier **.env** se trouvent déjà | ||
+ | dans l'objet **app.config** | ||
+ | Nous allons y intégrer les valeurs lues depuis le fichier **config.py** : | ||
- | ====== Restes de l'ancienne page : ====== | + | <code python __init.py__> |
+ | from flask import Flask | ||
- | ===== Configurer son application ===== | ||
- | |||
- | Juste après la création de l'objet **app**, charger le contenu de | ||
- | l'un ou l'autre fichier **.py** en fonction de l'environnement : | ||
- | |||
- | <code python> | ||
app = Flask(__name__) | app = Flask(__name__) | ||
- | if app.config['env'] == 'development': | + | # ceci va intégrer les valeurs de "config.py" |
- | app.config.from_object('config_dev') | + | app.config.from_object('config') |
- | + | ||
- | if app.config['env'] == 'production': | + | |
- | app.config.from_object('config_prod') | + | |
</code> | </code> | ||
- | Les deux fichiers sont situés à la racine de l'application. | + | ===== Accéder à la configuration ===== |
- | <code python config_prod.py> | + | <code python> |
- | import os | + | base_dir = app.config['BASE_DIR'] |
- | + | ||
- | DEBUG = True | + | |
- | + | ||
- | BASE_DIR = os.path.abspath(os.path.dirname(__file__)) | + | |
- | DBPATH = os.path.join(BASE_DIR, 'data/example.db') | + | |
- | + | ||
- | SECRET_KEY = "... clé secrète pour le développement ..." | + | |
</code> | </code> | ||
- | <code python config_dev.py> | + | Depuis un Blueprint, utiliser l'objet **current_app** : |
- | import os | + | |
- | + | ||
- | DEBUG = False | + | |
- | + | ||
- | BASE_DIR = os.path.abspath(os.path.dirname(__file__)) | + | |
- | DBPATH = '/var/data/production.db' | + | |
- | + | ||
- | SECRET_KEY = "... clé secrète pour la production ..." | + | |
- | </code> | + | |
- | + | ||
- | ===== Utiliser un fichier .env ===== | + | |
- | + | ||
- | Installer **python-dotenv** dans le Virtual Environment : | + | |
- | + | ||
- | <code bash> | + | |
- | source venv/bin/activate | + | |
- | (venv)$ pip install python-dotenv | + | |
- | </code> | + | |
- | + | ||
- | Créer un fichier **.env** à la racine du projet : | + | |
- | + | ||
- | <code> | + | |
- | /home/marc/flaskapp | + | |
- | ├── app | + | |
- | │ ├── __init__.py | + | |
- | │ └── ... | + | |
- | └── .env | + | |
- | </code> | + | |
- | + | ||
- | :!: Le fichier **.env** doit être dans le **.gitignore** sinon il sera publié | + | |
- | sur GitHub en même temps que le code :!: | + | |
- | + | ||
- | <code bash /home/marc/flaskapp/.env> | + | |
- | FLASK_ENV=development | + | |
- | PGUSER=marc | + | |
- | PGPASSWORD=my_password | + | |
- | </code> | + | |
- | + | ||
- | **Flask** va détecter la présence du fichier **.env** et charger | + | |
- | certaines valeurs depuis celui-ci (par exemple **FLASK_ENV**). | + | |
- | + | ||
- | Pour le reste, charger les variables d'environnement lors de | + | |
- | l'initialisation de l'application : | + | |
- | + | ||
- | <code python __init__.py> | + | |
- | import os | + | |
- | from flask import Flask, ... | + | |
- | from dotenv import load_dotenv | + | |
- | + | ||
- | ... | + | |
- | + | ||
- | app = Flask(__name__) | + | |
- | + | ||
- | base_dir = os.path.dirname(app.root_path) | + | |
- | load_dotenv(os.path.join(base_dir, '.env')) | + | |
- | </code> | + | |
- | + | ||
- | Ensuite il suffit de les utiliser dans le code de cette façon : | + | |
<code python> | <code python> | ||
- | import os | + | from flask import current_app |
- | username = os.getenv('PGUSER') | + | base_dir = current_app.config['BASE_DIR'] |
- | password = os.getenv('PGPASSWORD') | + | |
</code> | </code> | ||
- | |||
- | |||
===== Afficher le contenu de la configuration ===== | ===== Afficher le contenu de la configuration ===== | ||
Ligne 178: | Ligne 104: | ||
print("%-30s => %s" % item) | print("%-30s => %s" % item) | ||
</code> | </code> | ||
- | |||
- | ===== Accéder à la config depuis un Blueprint ===== | ||
- | |||
- | Utiliser **current_app** : | ||
- | |||
- | <code python> | ||
- | from flask import current_app | ||
- | |||
- | x = current_app.config['...'] | ||
- | </code> | ||
- | |||