我正在使用 Flask,我想保护 /admin 路径下的所有内容。
我怎样才能做到这一点?我确信有比在每个函数中检查会话更好的方法。
显而易见的方法是编写一个装饰器来测试会话,并在身份验证失败时重定向到另一个页面。我不知道你对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
)。
我认为,最直接的方法是使用类似于此代码段中描述的蓝图。然后,当 URL 以 开头时,您可以在每个请求之前运行一些代码/admin
,并且在该代码中您可以进行身份验证。