开发者

Where do I store data which is loaded on each request, in a Bottle-powered app?

I have a simple Bottle app which stores its configuration in a text file. Naturally, I need the config to be available in almost every handler of the app, and I want it to be reloaded on every request.

In Flask I could load the config file into开发者_Go百科 a ConfigParser instance in before_request and put a reference to it into an attribute of the g object, just as described in the Flask documentation as a way of connecting SQLite. The g object would then be available in every handler:

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

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

In Bottle, on the other hand, thread locals are considered a bad thing, and the suggested way of storing the DB connection is to write a plugin which analyzes the handlers for signatures using clever tricks. And while the problem is already solved for SQLite, it is not in case of some other arbitrary per-request data.

To be frank, I can't believe I'm supposed to write 60 lines of code to do such a simple task, so I guess I must be missing something.

Any ideas?


Since you want it reloaded every single request, why not just use a function?

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']

If you wanted to wrap that into a plugin it's fairly simple:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜