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:一次装饰每条路线?的主要内容,如果未能解决你的问题,请参考以下文章
Angular js - 显示/隐藏每条新路线的加载 gif