2

我目前正在学习 Flask,我只是设置了一个加载到应用程序中的配置文件:

app.config.from_object('myconfigmodule')

config 模块中有两个类,Config 和 DebugConfig,DebugConfig 继承了 Config。我想使用@property getter 来获取配置变量,而不是使用它们来访问它们,app.config['myvar']因为它可以使代码更简洁。我设置了这个并且 app.config 没有看到属性,但我仍然可以访问 config 类成员app.config['myvar']

这是我启动应用程序时遇到的错误:

Traceback (most recent call last):
File "runserver.py", line 3, in <module>
app.run(host=app.config['_APP_HOST'], debug=app.config.Debug)
AttributeError: 'Config' object has no attribute 'Debug'

在配置类中,Debug 属性如下:

class Config (object):
    _APP_DEBUG = False

    @property
    def Debug (self):
        return self._APP_DEBUG

我在这里做错了什么还是 Flask 出于某种原因不喜欢配置中的属性?谢谢你的帮助!

4

1 回答 1

3

Flask 有它自己的Config类(一个 dict 子类),它会挑选出给定对象的属性from_object,而不是按原样使用给定对象,如源代码所示:

# class Config(dict):
# ...
    for key in dir(obj):
        if key.isupper():
            self[key] = getattr(obj, key)

如您所见,它只会使用大写属性。

这是一个手动示例:

>>> from flask import config
>>> class X(object):
...     REGULAR = True
...     ignored = "not uppercase"
...     def __init__(self):
...         self.not_used = "because lowercase"
...         self.OK = True
...     
...     @property
...     def UPPER_PROP(self):
...         return True
...     
...     @property
...     def MIXED_case(self):
...         return "wont work"
... 
>>> x = X()
>>> c = config.Config(None)
>>> c.from_object(x)
>>> c
<Config {'REGULAR': True, 'OK': True, 'UPPER_PROP': True}>

也就是说,如果您想实现类似dot-dict'd subclass of flasks'之类的东西,没有什么能阻止您Config。由非标准方法引起的潜在混淆是否超过代码可读性的收益,您可以根据项目的范围来决定。

于 2013-01-09T04:50:34.157 回答