在带有自制装饰器的烧瓶中的应用环境之外工作

时间:2015-01-11 21:29:38

标签: python flask decorator python-decorators

我正在为自己的博客做一个博客,一切正常,甚至是会议。

现在,我正在尝试使用名为@require_login的装饰器来限制管理员。我认为我做的事情确实是错的,除了无效的事实。

这是我的装饰者:

def requirir_login(func):
    request = make_response()
    if session['logged_in'] == True:

        return func
    else: 
        print("no hay sesion registrada webon")

这里用它来装饰管理功能:

@app.route("/admin")
@requirir_login
def admin():
    users = User.objects

    return render_template("admin.html", users=users)

我的逻辑背后是检查是否有会话然后返回管理功能。如果不是,我想在终端中检查该消息以进行测试。

如果还没有会话,我还没决定该怎么做。我可能会重定向到登录页面或其他东西。

1 个答案:

答案 0 :(得分:2)

你的装饰者需要提供一个包装器函数,它将被调用来代替装饰函数。只有在调用该包装器时才会发送实际请求,并且可以测试会话:

from functools import wraps

def requirir_login(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        if session['logged_in']:
            return func(*args, **kwargs)
        else: 
            print("no hay sesion registrada webon")
    return wrapper

当应用装饰器时,会调用它的返回值来替换装饰的函数。这里返回wrapper,现在成为您的查看功能。

包装器传递所有未经修改的参数,使得装饰器适用于任何视图函数,无论它们期望从路径传递的参数如何。

我还做了一些其他更改来改进装饰器的功能:

  • 您不需要为== True进行测试;这是if
  • 我使用@functools.wraps() decorator为您的包装器提供与原始包装视图函数相同的名称和文档字符串,在调试时总是有用。

如果你有一个登录表单,你确实可以使用重定向:

return redirect(url_for('login'))

如果您的登录视图名为login

相关问题