python装饰器应用

来自kimi ai

from flask import session,flash,redirect,url_for
from functools import wraps
def 需要登录(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not session.get('logged_in', False):
            # 如果用户未登录,重定向到登录页面,并提示需要登录
            flash('你需要登录。')
            return redirect(url_for('login.login'))
        return f(*args, **kwargs)
    return decorated_function

 

这段代码定义了一个名为 需要登录 的装饰器,用于 Flask 应用中保护需要用户登录后才能访问的视图函数。下面是对这段代码的详细解释:

  1. 导入必要的模块:
    from flask import session, flash, redirect, url_for
    from functools import wraps

    导入 Flask 的 session 用于访问和管理用户会话信息;flash 用于向用户显示一次性消息;redirect 用于重定向用户到另一个 URL;url_for 用于获取路由的 URL。wraps 用于保留原函数的名称和文档字符串。

  2. 定义装饰器 需要登录:
    def 需要登录(f):

    需要登录 是一个装饰器工厂函数,它接受一个函数 f 作为参数,f 通常是 Flask 应用中的一个视图函数。

  3. 使用 wraps 装饰器:
    @wraps(f)

    使用 wraps 来包装 decorated_function,这样可以让装饰后的函数保持原始函数 f 的名称和文档字符串。

  4. 定义嵌套函数 decorated_function:
    def decorated_function(*args, **kwargs):

    decorated_function 是一个嵌套函数,它将作为装饰器返回的函数。它接受任意数量的位置参数 *args 和关键字参数 **kwargs,以便将这些参数传递给原始的视图函数 f

  5. 检查用户是否已登录:
    if not session.get('logged_in', False):

    使用 session.get 方法检查 session 中是否有 'logged_in' 键,并且其值是否为 True。如果用户未登录(即 'logged_in' 键不存在或值为 False),则执行以下重定向和消息提示操作。

  6. 显示登录提示并重定向到登录页面:
    flash('你需要登录。')
    return redirect(url_for('login.login'))

    使用 flash 函数向用户显示一条消息,提示用户需要登录。然后使用 redirect 函数和 url_for 函数重定向用户到登录页面。这里假设登录视图函数的端点(endpoint)名称为 'login.login'

  7. 调用原始的视图函数:
    return f(*args, **kwargs)

    如果用户已登录,decorated_function 将调用原始的视图函数 f,并传入所有接收到的参数。

  8. 返回装饰器函数:
    return decorated_function

    需要登录 装饰器返回 decorated_function 函数,这样它就可以被用作装饰器。

使用这个装饰器,你可以保护 Flask 应用中的任何视图函数,确保只有登录用户才能访问。例如:

@app.route('/protected')
@需要登录
def protected():
return "这是一个受保护的页面,只有登录用户才能看到。"

在这个例子中,任何尝试访问 /protected 路由的用户,如果没有登录,都会被重定向到登录页面,并在登录页面上显示一条消息。如果用户已经登录,他们将能看到受保护页面的内容。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注