2015-12-08 44 views
5

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

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

我正在将身份验证从Web服务器(apache)移动到应用程序级别,这就是为什么我有这个问题。

+0

您是否试过编写修改过的路由器? – ferrix

+0

简单的'login_required'检查总是对你来说足够了吗?我总是最终需要不同用户的不同级别的权限,所以我用'require_privilege('特权名')'装饰所有东西。如果你决定走这条路,我会问,但除了装饰每一条路线(他们需要不同的权限)之外,真的没有办法。 – zvone

+0

@ferrix不,我没有听说过,但我会检查出来。不,我们没有不同的权限/角色。每个用户都有相同的权限。 – steve

回答

8

你可以走了相反的方式,并使用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

+0

感谢这和其他职位的链接。 ''app.view_functions''是我一直在寻找的秘密武器。只要有对这些功能的引用,url就可以映射到这些功能。 – steve