[PYTHON] Meilleures pratiques pour les fichiers de configuration dans Flask

Aperçu

Lors de la création d'un fichier de configuration dans l'application Flask J'étudiais comment diviser chaque environnement et cacher le contenu.

Lire Documents officiels et Articles d'outre-mer Je vais résumer cela. La majeure partie de cette page est réalisée à partir des deux traductions japonaises ci-dessus.

Config dans Flask

Je vais résumer les parties qui devraient être conservées dans le fichier de configuration Flask.

Paramètres de base

Vous pouvez écrire dans la variable config de l'instance Flask au format dictionnaire.

Paramètres de base


app.config['DEBUG'] = True

Paramètres du fichier

Vous pouvez lire la liste des paramètres à partir du fichier spécifié.

Paramètres du fichier


#Modèle qui spécifie directement le chemin du fichier
app.config.from_pyfile('config_file.cfg')

#Un modèle qui spécifie une variable d'environnement (chemin absolu) qui indique l'emplacement du fichier
app.config.from_envvar('FLASK_CONFIG_FILE')

Dans le fichier, vous pouvez décrire les paramètres dans le format de fichier INI suivant.

config_file.cfg


TESTING=False
DEBUG=True

Paramètres de l'objet

Vous pouvez charger les paramètres en tant qu'objet Python.

Paramètres de l'objet


app.config.from_object('config.BaseConfig')

J'ai senti que je pouvais voir from_json dans le code source, mais je vais l'ignorer. Dans le fichier, vous pouvez structurer les paramètres sous forme de scripts Python comme suit:

config.py


class BaseConfig(object):
    DEBUG = False
    TESTING = False


class DevelopmentConfig(BaseConfig):
    DEBUG = True
    TESTING = True


class TestingConfig(BaseConfig):
    DEBUG = False
    TESTING = True

Dossier d'instance

Le contrôle de la version source est essentiel lors du développement d'applications Le fichier de configuration comprend les mots de passe, les clés d'accès API, etc. Il y a des informations que vous ne souhaitez pas inclure dans la gestion des versions.

Dans Flask, le "dossier d'instance" est Il s'agit d'une fonction pour exclure un fichier de paramètres spécifique de la gestion des versions.

Vous pouvez spécifier le dossier d'instance avec un chemin absolu lors de l'initialisation de Flask.

Spécification du chemin du dossier d'instance


app = Flask(__name__, instance_path='/path/to/instance/folder')

Si ce n'est pas spécifié, le répertoire par défaut «instance» sera Il sera reconnu comme un dossier d'instance.

Si vous écrivez comme suit, utilisez un chemin relatif à partir du dossier d'instance Vous pouvez lire le fichier de paramètres.

Appel de fichier relatif


app = Flask(__name__, instance_relative_config=True)
app.config.from_pyfile('application.cfg', silent=True)

Ici, nous faisons référence à ʻinstance / application.cfg. silent = True` supprime l'erreur lorsque le fichier n'est pas trouvé.

Cependant, cela seul ne signifie pas qu'il peut être exclu de la gestion des versions. ** N'oubliez pas de mettre le chemin du dossier d'instance dans ** .gitignore **. ** **

meilleur entrainement

Il y a une section sur les Meilleures pratiques sur la page officielle. Le contenu est court et pas très précis. (En raison de problèmes de maîtrise de l'anglais, je ne peux lire que "Il vaut mieux être facile à tester" ...)

D'autre part, l'article ici déclare ce qui suit.

Good practice is to have a default configuration, which is under source control and to override it with sensitive and specific information kept in instance folders. For the default configuration you could use object-based configuration hierarchy(described in Object-based configuration section) and to manage which configuration object to load via environment variables:

Le dernier élément consiste à basculer entre «développement» et «production». L'écrire comme un objet devrait faciliter le test.

À titre d'exemple spécifique, il est décrit comme suit.

Meilleures pratiques (non officielles)


#Le paramètre de base est config sous contrôle de version.Décrit comme un objet dans py
config = {
    "development": "bookshelf.config.DevelopmentConfig",
    "testing": "bookshelf.config.TestingConfig",
    "default": "bookshelf.config.DevelopmentConfig"
}

def configure_app(app):
    #Déterminez le fichier de paramètres à lire à l'aide des variables d'environnement
    config_name = os.getenv('FLASK_CONFIGURATION', 'default')
    
    #Lire les paramètres sous forme d'objets
    app.config.from_object(config[config_name])
    
    #Remplacer les paramètres sensibles par les paramètres du dossier d'instance
    app.config.from_pyfile('config.cfg', silent=True)

Résumé

Je pense qu'il serait difficile d'appliquer les paramètres ci-dessus à tous

J'avais la reconnaissance que.

Je l'ai écrit depuis longtemps, mais en fin de compte, il s'agit de savoir si je peux être d'accord avec lui. Même si la configuration est sale, il n'y a pas de problème pour le moment tant que le fichier secret n'est pas divulgué.

J'espère trouver une meilleure forme à mesure que l'application se développe.

Recommended Posts

Meilleures pratiques pour les fichiers de configuration dans Flask
Opérations sur les fichiers en Python
Manipulation de fichiers avec Python
Lire les paramètres de journalisation à partir d'un fichier externe avec Flask
Modifier le répertoire de stockage de fichiers statiques et l'URL dans Flask
Téléchargeur d'images avec Flask
Meilleures pratiques pour la gestion dynamique des messages LINE Flex dans Django
feuille de triche de fichier de réglage tox
Découvrez les bonnes pratiques de cookiecutter-django
Variables d'environnement HTTP dans Flask
__version__ pièges et bonnes pratiques
Afficher le fichier JSON japonais
Télécharger plusieurs fichiers avec Flask
Vérifiez si le fichier de paramètres est lu de manière simple à comprendre