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

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

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

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

【问题讨论】:

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

标签: python flask flask-login login-required


【解决方案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
  • 这里的用例是关于没有蓝图的旧版应用程序。所有路由都定义在一个文件中,有数百条,每条都需要身份验证。
猜你喜欢
  • 1970-01-01
  • 2018-06-05
  • 1970-01-01
  • 2021-11-27
  • 2019-06-24
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多