【发布时间】:2015-10-23 18:17:21
【问题描述】:
我有以下有效的代码。它对给定 url 的管理员用户进行身份验证。如果用户不是管理员,则返回 401。
片段 1:
__author__ = 'xxxx'
from flask import render_template, url_for
from flask import Blueprint, redirect, request, session, abort
from google.appengine.api import users
admin_routes = Blueprint('admin_routes', __name__)
@admin_routes.route('/xxxx')
def basic():
user = users.get_current_user()
if user:
if not users.is_current_user_admin():
return abort(401)
else:
return render_template('xxx/xxxx.html', user=user,
logout=users.create_logout_url('/'))
else:
return redirect(users.create_login_url('/xxxx'))
上面的代码有效,我想用它做一个装饰器。所以我写了以下内容。但是它不起作用,因为
的值用户 = 无
片段 2:
from google.appengine.api import users
from flask import abort, redirect
def authenticate_admin(func):
def authenticate_and_call(*args, **kwargs):
user = users.get_current_user()
if user is None:
print("Redirecting user to login page")
return redirect(users.create_login_url('xxxxx/xxxx'), 401)
else:
if not users.is_current_user_admin():
return abort, 401
return func(*args, **kwargs)
return authenticate_and_call()
我将如何编写装饰器,使其完成 Snippet 1 的功能。最终结果应该是这样的。
__author__ = 'xxxxxx'
from flask import render_template, url_for
from flask import Blueprint, redirect, request, session, abort
from google.appengine.api import users
admin_routes = Blueprint('admin_routes', __name__)
@authenticate_admin
@admin_routes.route('/xxxx')
def basic():
return render_template('xxx/xxxx.html', user=user,
logout=users.create_logout_url('/'))
上述代码的异常是
UndefinedError: 'None' has no attribute 'nickname'
【问题讨论】:
-
你可以尝试改变装饰器的顺序吗?你想用
@admin_routes装饰的函数是已经被authenticate_admin装饰的函数吧?感觉就像@admin_routes将路由分配给函数basic,当您路由到/xxxx时,它使用函数basic进行路由,而您的render_template使用user.nickname,其中您的user是None -
@hgwells。是的,更改顺序已经奏效。我想知道为什么?
标签: python google-app-engine flask python-decorators