在Bottle应用中,我该把每个请求加载的数据存储在哪里?

0 投票
1 回答
1165 浏览
提问于 2025-04-16 20:54

我有一个简单的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']

撰写回答