我收到以下类型错误:
TypeError: wrapper() got an unexpected keyword argument 'id'
当我尝试用这些装饰器执行一个函数时:
def owner_required(table):
def tags_decorator(func):
@wraps(func) # this requires an import
def wrapper(id):
user_profile = (session['username'], session['picture'])
# Connect to the database
con = connect()
Base.metadata.bind = con
# Creates a session
DBSession = sessionmaker(bind=con)
dbsession = DBSession()
if table == 'incidents':
query = dbsession.query(Incidents).
filter_by(case_num=id).first()
if table == 'audits':
query = dbsession.query(Audits).filter_by(id=id).first()
if table == 'actions':
query = dbsession.query(Actions).filter_by(id=id).first()
creator = int(query.user_id)
ses_user = int(session['user_id'])
if 'username' not in session or creator != ses_user:
flash("Sorry, %s,"
" you are not authorized to edit this incident." %
session['username'])
return redirect('/incidents/')
else:
func()
return wrapper
return tags_decorator
def check_if_report_exists(table):
def tags_decorator(func):
@wraps(func) # this requires an import
def wrapper(**kwargs):
# Connect to the database
con = connect()
Base.metadata.bind = con
# Creates a session
DBSession = sessionmaker(bind=con)
dbsession = DBSession()
if table == 'incidents':
query = dbsession.query(Incidents).filter_by(case_num=id).first()
if table == 'audits':
query = dbsession.query(Audits).filter_by(id=id).first()
if table == 'actions':
query = dbsession.query(Actions).filter_by(id=id).first()
if query is None:
flash("Sorry, %s,"
" this report does not exists" %
session['username'])
return redirect('/dashboard/')
else:
func(**kwargs)
return wrapper
return tags_decorator
以下是装饰器的功能:
app.route('/incidents/edit/<int:id>/', methods=['GET', 'POST'])
@login_required
@owner_required('incidents')
@check_if_report_exists('incidents')
def editIncident(id):
some code...
基本上,路由使用Flask将整数传递给函数,以使用正确的信息调用页面。我需要在装饰器中使用相同的编号,以确保登录的用户是创建页面的用户编辑它的人。
我一直关注this guide装饰器,特别是关于将装饰传递给装饰器的部分。
答案 0 :(得分:0)
这是一个愚蠢的错误 - 我专注于错误的装饰者。 @login_required没有传递任何参数。
我通过将(* args,** kwargs)传递给包装器和函数来解决它:
def login_required(session):
def tags_decorator(func):
@wraps(func) # this requires an import
def wrapper(*args, **kwargs):
logger.info('Checking if user in logged in.')
if 'username' not in session:
logger.info('User is not logged in.')
return redirect('login')
else:
logger.info('User is logged in.')
return func(*args, **kwargs)
return wrapper
return tags_decorator
我犯的另一个错误是没有返回func(),所以我收到了一个View Error。我假设这是因为我使用的是Python 3。