使用自制装饰器在烧瓶中的应用程序上下文之外工作

working outside of aplication context in flask with a self made decorator

我正在从头开始为自己写博客,一切正常,甚至 sessions。

现在我试图用一个名为 @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)

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

如果还没有 session,我还没有决定怎么办。我可能会重定向到 log-in 页面或其他内容。

您的装饰器需要提供一个 wrapper 函数,它将代替装饰函数被调用。只有在调用包装器时才会路由实际请求,您才能测试会话:

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

当装饰器被应用时,它被称为它的 return 值 替换装饰函数。这里 wrapper 是 return 编辑的,因此它现在成为您的视图函数。

包装器原封不动地传递所有参数,使您的装饰器适用于任何视图函数,而不管它们期望从路由传入的参数如何。

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

  • 您不需要测试== True;这就是 iffor,以测试表达式的结果是否为真。
  • 我使用 @functools.wraps() decorator 为您的包装器提供了与原始包装视图函数相同的名称和文档字符串,这在调试时总是很有帮助。

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

return redirect(url_for('login'))

如果您的登录视图名为 login