【问题标题】:working outside of aplication context in flask with a self made decorator使用自制装饰器在烧瓶中的应用程序上下文之外工作
【发布时间】:2015-03-09 15:34:05
【问题描述】:

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

现在我正在尝试使用名为@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)

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

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

【问题讨论】:

标签: python flask decorator python-decorators


【解决方案1】:

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

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 for的含义,用于测试表达式的结果是否为真。
  • 我使用@functools.wraps() decorator 为您的包装器提供与原始包装视图函数相同的名称和文档字符串,这在调试时总是很有帮助。

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

return redirect(url_for('login'))

如果您的登录视图名为login

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多