17

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

有没有办法在整个应用程序中一次装饰所有路线?

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

4

1 回答 1

23

您可以采取相反的方式并使用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 类中。

编辑:基本上是使 Flask-Login 的 login_required 成为默认值的最佳方式

于 2015-12-08T20:03:24.390 回答