2

私は現在Flaskを学んでおり、アプリにロードする構成ファイルをセットアップしました:

app.config.from_object('myconfigmodule')

config モジュールには Config と DebugConfig の 2 つのクラスがあり、DebugConfig は Config を継承します。@property ゲッターを使用して、構成変数にアクセスするのではなく、構成変数を取得したいと思いapp.config['myvar']ます。これにより、コードがよりクリーンになります。これを設定すると、app.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'

config クラスの 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}>

そうは言っても、フラスコのドット辞書のサブクラスのようなものを実装したい場合は、何もあなたを妨げませんConfig。非標準のアプローチによって引き起こされる潜在的な混乱が、コードの可読性の向上を上回るかどうかは、プロジェクトの範囲に基づいて決定できます。

于 2013-01-09T04:50:34.157 に答える