2011-07-05 3 views
0

私はテキストファイルにその設定を保存する単純なボトルアプリを持っています。当然のことながら、私は設定がアプリケーションのほぼすべてのハンドラで利用可能にする必要があり、私はそれがすべての要求に再ロードされるようにしたい。フラスコ内のBottle-poweredアプリで、各リクエストにロードされるデータはどこに保存しますか?

私はbefore_requestConfigParserインスタンスに設定ファイルをロードし、connecting SQLiteの方法として、フラスコのマニュアルの説明と同じように、gオブジェクトの属性にそれへの参照を入れることができます。 gオブジェクトは、すべてのハンドラで利用できるようになります:

@app.before_request 
def before_request(): 
    g.config = load_config() 

@app.route('/') 
def index(): 
    param = g.config.get(...) 
    ... 

瓶の中に、他の一方で、スレッド地元の人々が悪いことと考えられ、そしてDB接続を格納する提案の方法は、のためのハンドラを分析to write a pluginでいます巧妙なトリックを使用して署名。また、この問題はすでにSQLiteで解決されていますが、他の任意のリクエストごとのデータがない場合もあります。

率直に言って、私はこのような簡単な作業を行うために60行のコードを書かなければならないと信じられないので、何かが欠けているはずです。

アイデア?

答えて

1

1回のリクエストごとにリロードしたいので、関数を使用するだけではどうですか?

def get_config(): 
    with open('config.json') as f: 
     return json.load(f) 

@route('/') 
def index(): 
    config = get_config() 
    return 'Welcome to %s' % config['site_name'] 

あなたは、それはかなり簡単ですプラグインにそのラップをしたい場合:

def config_plugin(callback): 
    def wrapper(*args, **kwargs): 
     kwargs['config'] = get_config() 
     return callback(*args, **kwargs) 
    return wrapper 

install(config_plugin) 

@route('/') 
def index(config): 
    return 'Welcome to %s' % config['site_name'] 
+0

感謝。しかし、Configはモデルの例でした。私が要求内で追跡するのに必要な3つまたは4つの似たようなものがあるとします。もちろん、ハンドラにはすべてが必要であり、ほとんどは1つまたは2つしか必要とせず、静的ファイルハンドラのようなものはまったく必要ありません。一方、あなたの解決策は、_every_ハンドラが 'config'引数を受け入れることを意味します。私は「60行プラグイン」を採用することができますが、これは避けたかったことです。 – Helgi

+0

@Helgi Nahはまったくありません。あなたはそれよりも柔軟なプラグインのドキュメントを読むべきです。すべてのルートにプラグインを適用する必要はありません(http://bottlepy.org/docs/dev/tutorial.html#route-specific-installation)。あなたが望むものは本当にわかりませんが、Pythonでもスレッドのローカルで読むことができます:http://docs.python.org/library/threading.html#threading.local。 – zeekay