在Bottle应用中,我该把每个请求加载的数据存储在哪里?
我有一个简单的Bottle应用,它的配置存储在一个文本文件里。自然,我需要在应用的几乎每个处理函数中都能使用这个配置,并且希望在每次请求时都能重新加载。
在Flask中,我可以在before_request
这个函数里把配置文件加载到一个ConfigParser
实例中,然后把它的引用放到g
对象的一个属性里。这样做就像Flask文档中描述的那样,可以用来连接SQLite。这样,g
对象在每个处理函数中都能使用:
@app.before_request
def before_request():
g.config = load_config()
@app.route('/')
def index():
param = g.config.get(...)
...
而在Bottle中,线程本地存储被认为是个坏主意,所以推荐的存储数据库连接的方法是写一个插件,这个插件会用一些聪明的技巧分析处理函数的签名。虽然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']