Browse Source

Merge branch 'config-from-json' of https://github.com/mattupstate/flask into mattupstate-config-from-json

pull/980/head
Daniel Neuhäuser 11 years ago
parent
commit
95a1ce4d6e
  1. 27
      flask/config.py
  2. 19
      flask/testsuite/config.py
  3. 4
      flask/testsuite/static/config.json

27
flask/config.py

@ -15,6 +15,7 @@ import errno
from werkzeug.utils import import_string
from ._compat import string_types
from . import json
class ConfigAttribute(object):
@ -164,5 +165,31 @@ class Config(dict):
if key.isupper():
self[key] = getattr(obj, key)
def from_json(self, filename, silent=False):
"""Updates the values in the config from a JSON file. This function
behaves as if the JSON object was a dictionary and passed ot the
:meth:`from_object` function.
:param filename: the filename of the JSON file. This can either be an
absolute filename or a filename relative to the
root path.
:param silent: set to `True` if you want silent failure for missing
files.
"""
filename = os.path.join(self.root_path, filename)
try:
with open(filename) as json_file:
obj = json.loads(json_file.read())
except IOError as e:
if silent and e.errno in (errno.ENOENT, errno.EISDIR):
return False
e.strerror = 'Unable to load configuration file (%s)' % e.strerror
raise
for key in obj.keys():
if key.isupper():
self[key] = obj[key]
return True
def __repr__(self):
return '<%s %s>' % (self.__class__.__name__, dict.__repr__(self))

19
flask/testsuite/config.py

@ -41,6 +41,12 @@ class ConfigTestCase(FlaskTestCase):
app.config.from_object(__name__)
self.common_object_test(app)
def test_config_from_json(self):
app = flask.Flask(__name__)
current_dir = os.path.dirname(os.path.abspath(__file__))
app.config.from_json(os.path.join(current_dir, 'static', 'config.json'))
self.common_object_test(app)
def test_config_from_class(self):
class Base(object):
TEST_KEY = 'foo'
@ -100,6 +106,19 @@ class ConfigTestCase(FlaskTestCase):
self.assert_true(0, 'expected config')
self.assert_false(app.config.from_pyfile('missing.cfg', silent=True))
def test_config_missing_json(self):
app = flask.Flask(__name__)
try:
app.config.from_json('missing.json')
except IOError as e:
msg = str(e)
self.assert_true(msg.startswith('[Errno 2] Unable to load configuration '
'file (No such file or directory):'))
self.assert_true(msg.endswith("missing.json'"))
else:
self.assert_true(0, 'expected config')
self.assert_false(app.config.from_json('missing.json', silent=True))
def test_session_lifetime(self):
app = flask.Flask(__name__)
app.config['PERMANENT_SESSION_LIFETIME'] = 42

4
flask/testsuite/static/config.json

@ -0,0 +1,4 @@
{
"TEST_KEY": "foo",
"SECRET_KEY": "devkey"
}
Loading…
Cancel
Save