是否有更有效的方法为每个视图设置会话变量?

时间:2014-02-16 00:04:10

标签: python flask

我是烧瓶的新手。我有很多关于参数的观点,比如<name>。我想将<name>存储在会话变量中,而不必为每个视图执行此操作。这可能吗?

@app.route('/home/',defaults={'name':None})
@app.route('/home/<name>/')
def name():
  session['name'] = name
  return ...

@app.route('/another/',defaults={'name':None})
@app.route('/another/<name>/')
def name():
  session['name'] = name # repetitive
  return ...

1 个答案:

答案 0 :(得分:1)

据我了解,您将name视为参数。所以在这种情况下你可以编写自己的装饰器:

def set_session(fn):
    @functools.wraps(fn)
    def wrapper(name, *args, **kwargs):
        session['name'] = name
        return fn(name, *args, **kwargs)
    return wrapper

@app.route('/home/',defaults={'name':None})
@app.route('/home/<name>/')
@set_session
def name(name):
    return ...

您还可以更新Flask视图:

class MyApp(Flask):
    def add_url_rule(self, rule, endpoint=None, view_func=None, **options):
        if (view_func is not None):
            view_func = set_session(view_func)
        return super(MyApp, self).add_url_rule(rule, endpoint,
                                               view_func, **options)

可能最好的解决方案是使用可插入的视图:http://flask.pocoo.org/docs/views/。如果你有几个装饰器,它会更有用。