Flask:一次装饰每条路线?

Posted

技术标签:

【中文标题】Flask:一次装饰每条路线?【英文标题】:Flask: Decorate every route at once? 【发布时间】:2016-03-13 21:06:14 【问题描述】:

我有 @login_required 装饰控制器动作的装饰器。但是我的应用程序非常大,并且在许多不同的控制器文件中有大量路由。一条一条地装饰每条路线似乎容易出错(我很容易错过一条)并且很耗时。

有没有办法一次性装饰整个应用中的所有路线?

我正在将身份验证从 Web 服务器 (apache) 转移到应用程序级别,这就是我遇到此问题的原因。

【问题讨论】:

你试过写一个修改过的路由器吗? 简单的login_required 支票对您来说总是足够了吗?我总是最终需要为不同的用户提供不同级别的权限,所以我用require_privilege('privilege name') 装饰所有东西。我问是因为如果你决定走那条路,那么除了装饰每条路线之外真的别无他法(它们需要不同的权限)。 @ferrix 不,我没听说过,但我会去看看。 zvone 不,我们没有不同的权限/角色。每个用户都有相同的权限。 【参考方案1】:

你可以反其道而行之,使用before_request装饰器默认要求登录,并使用自定义装饰器标记不需要需要登录的路由,例如:

_insecure_views = []

@my_blueprint.before_request
def require_login():
    if request.endpoint in _insecure_views:
        return
    # check for login here

def login_not_required(fn):
    '''decorator to disable user authentication'''
    endpoint = ".".join([some_blueprint.name, fn.func_name])
    _insecure_views.append(endpoint)
    return fn

@some_blueprint.route('/')
@login_not_required
def index():
    pass

您可以将其包装到它自己的派生蓝图/Flask 类中。

编辑:基本上是Best way to make Flask-Login's login_required the default

【讨论】:

感谢您提供此内容以及指向其他帖子的链接。 app.view_functions 是我一直在寻找的秘方。只要有对函数的引用,就可以修饰映射到这些函数的 url。 虽然我喜欢这个答案显示了如何将登录要求设为默认值,但我对这里的用法有点困惑:难道不应该为需要登录的路由提供单独的蓝图并且这样不,并以这种方式修改蓝图的::before_request 这里的用例是关于没有蓝图的旧版应用程序。所有路由都定义在一个文件中,有数百条,每条都需要身份验证。

以上是关于Flask:一次装饰每条路线?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保烧瓶应用程序已在所有路线上获得授权?

OR-Tools - 最小化每条路线覆盖的区域

Flask:获取当前路线

Angular js - 显示/隐藏每条新路线的加载 gif

Angular js - 显示/隐藏每条新路线的加载 gif

如何在每条路线中呈现相同的组件