2

我正在使用 Flask,我想保护 /admin 路径下的所有内容。

我怎样才能做到这一点?我确信有比在每个函数中检查会话更好的方法。

4

2 回答 2

3

显而易见的方法是编写一个装饰器来测试会话,并在身份验证失败时重定向到另一个页面。我不知道你对python了解多少,但是装饰器是一个接受一个函数并返回另一个函数的函数。基本上,它是一个函数修饰符。这是一个装饰器,它应该向您展示编写自己的方法来检查会话:

import functools

def check_session(view):
    @functools.wraps(view)
    def inner(*args, **kwargs):
        if <test for auth>:
            return view(*args, **kwargs)
        else:
            return flask.redirect("/")
    return inner

正如你所看到的,我们有一个接受视图函数的函数,然后定义了一个名为 inner 的新函数,它检查身份验证,如果成功,则调用原始视图。该行@functools.wraps(view)是使用装饰器的示例;装饰器给出了functools.wraps它正在包装的函数的属性,它作为它的第一个参数给出。要使用此装饰器,请将其应用于您的视图,如下所示:

@app.route("/admin")
@check_session
def admin_view():
    return "Top secret"

任何未通过身份验证检查的用户现在都将被重定向,并且这样做的用户将能够像往常一样看到该视图。装饰器按从下到上的顺序应用,因此请确保将其放在任何其他进行函数注册的装饰器之后(即@app.route)。

于 2012-05-14T07:03:39.393 回答
3

我认为,最直接的方法是使用类似于此代码段中描述的蓝图。然后,当 URL 以 开头时,您可以在每个请求之前运行一些代码/admin,并且在该代码中您可以进行身份​​验证。

于 2012-05-14T14:16:40.187 回答