Browse Source

initial commit

dev/env.load.all
Brett Langdon 9 years ago
parent
commit
a984a7c311
3 changed files with 129 additions and 2 deletions
  1. +0
    -2
      README.md
  2. +85
    -0
      README.rst
  3. +44
    -0
      flask_env.py

+ 0
- 2
README.md View File

@ -1,2 +0,0 @@
# flask-env
Easily set Flask settings from environment variables

+ 85
- 0
README.rst View File

@ -0,0 +1,85 @@
flask-env
=========
Easily set Flask settings from environment variables.
The reason for using :code:`flask-env` is to be able to follow the `12-factor app <http://12factor.net/>`_ suggestions for configuring your application.
With :code:`flask-env` you can define your default configuration options in code and very easily override via environment variables.
Installation
~~~~~~~~~~~~
.. code:: bash
pip install flask_env
Usage
~~~~~
With :code:`flask-env` you will define your configuration as an object and load it into your Flask application via `app.config.from_object <http://flask.pocoo.org/docs/0.11/api/#flask.Config.from_object>`_ method.
To use in Python 2:
.. code:: python
from flask import Flask
from flask_env import MetaFlaskEnv
class Configuration(object):
__metaclass__ = MetaFlaskEnv
DEBUG = False
PORT = 5000
app = Flask(__name__)
app.config.from_object(Configuration)
To use in Python 3:
.. code:: python
from flask import Flask
from flask_env import MetaFlaskEnv
class Configuration(metaclass=MetaFlaskEnv):
DEBUG = False
PORT = 5000
app = Flask(__name__)
app.config.from_object(Configuration)
Configuration
~~~~~~~~~~~~~
:code:`flask-env` offers two configuration options to determine how/which environment variables are loaded.
ENV_PREFIX
Only consider environment variables that start with this prefix.
The prefix will be removed from the environment variable name when setting in the configuration.
(default: :code:`''`, example: :code:`ENV_PREFIX = 'MYAPP_'`)
AS_JSON
Whether or not to try and parse each configuration value as JSON.
This will ensure that when setting variables as integers/null/booleans that they properly get parsed in their applicable Python types.
(default: :code:`True`, example: :code:`AS_JSON = False`)
Setting configuration values:
.. code:: python
from flask_env import MetaFlaskEnv
class Configuration(metaclass=MetaFlaskEnv):
ENV_PREFIX = 'MYAPP_'
AS_JSON = False

+ 44
- 0
flask_env.py View File

@ -0,0 +1,44 @@
import json
import os
import sys
# DEV: In `python3` we raise `JSONDecodeError` instead of `ValueError` on a bad parse
json_decode_error = ValueError
if sys.version_info.major == 3:
json_decode_error = json.decoder.JSONDecodeError
class MetaFlaskEnv(type):
def __init__(cls, name, bases, dict):
"""
MetaFlaskEnv class initializer.
This function will get called when a new class which utilizes this metaclass is defined,
as opposed to when it is initialized.
"""
super(MetaFlaskEnv, cls).__init__(name, bases, dict)
# Get our internal settings
prefix = dict.get('ENV_PREFIX', '')
as_json = dict.get('AS_JSON', True)
# Override default configuration from environment variables
for key, value in os.environ.items():
# Only include environment keys that start with our prefix (if we have one)
if not key.startswith(prefix):
continue
# Strip the prefix from the environment variable name
key = key[len(prefix):]
# Attempt to parse values as JSON if requested (default behavior)
# DEV: This will ensure that doing `PREFIX_PORT=8000` will result in `int(8000)` and not `str(8000)`
if as_json:
try:
value = json.loads(value)
except json_decode_error:
pass
# Update our config with the value from `os.environ`
setattr(cls, key, value)

Loading…
Cancel
Save