Tyl*_*eat 3 python google-app-engine flask python-decorators
这让我疯狂,因为它应该是如此简单,但必须有一些我错过的Python怪癖.我有一个装饰器,我正在尝试应用于Flask路线,但由于某些原因,我的views.py中的装饰器似乎都没有被加载.
decorators.py
def admin_required(func):
"""Require App Engine admin credentials."""
@wraps(func)
def decorated_view(*args, **kwargs):
if users.get_current_user():
if not users.is_current_user_admin():
abort(401) # Unauthorized
return func(*args, **kwargs)
return redirect(users.create_login_url(request.url))
return decorated_view
Run Code Online (Sandbox Code Playgroud)
views.py
@admin_required
@blueprint.route('/')
def index():
return render_template('index.html')
Run Code Online (Sandbox Code Playgroud)
该admin_required装饰功能不会被调用(index.html的加载没有重定向),我想不通为什么.
简答:改变装饰者的顺序; blueprint.route只看到你未修饰的功能.
装饰器从里到外应用,与函数调用类似.因此,您的函数定义等效于:
def index():
return render_template('index.html')
index = blueprint.route('/')(index)
index = admin_required(index)
Run Code Online (Sandbox Code Playgroud)
注意如何blueprint.route在index函数被包装之前传递该函数admin_required.当然,admin_required最终会被应用到index模块中的名称,所以如果你直接调用 index它,它将通过两个装饰器.但是你没有直接调用它,你告诉烧瓶的请求处理器调用它.
| 归档时间: |
|
| 查看次数: |
882 次 |
| 最近记录: |