Python - Obter argumentos função original em decorador
Pergunta
Eu estou tentando escrever um decorador "login_required" para os pontos de vista em um aplicativo WSGI + Werkzeug.
A fim de fazer isso, eu preciso para obter a sessão do usuário, que é acessível através do objeto de solicitação que é passado para os métodos de exibição.
Eu não consigo descobrir como chegar a essa instância de solicitação na decorador, no entanto. Olhei para PEP318, especificamente o quarto exemplo, mas eu não estou bastante começá-lo.
Aqui está o que estou tentando:
def login_required(*args, **kw):
def goto_login(**kw):
return redirect(url_for('login'))
def decorate(f):
# args[0] should be request
args[0].client_session['test'] = True
logged_in = 0
if logged_in:
return f
else:
return goto_login
return decorate
@login_required()
@expose('/hello/<string:name>')
def hello(request, name):
return render_template('say_hello.html', name=name)
mas eu recebo um índice de erro de falta de limites tentando args[0]
chamada.
Existe alguma maneira eu posso obter acesso ao argumento pedido passado para a função "Olá" na decorador "login_required"?
Solução
O login_required
decorador é passado para a função (hello
neste caso).
Então, o que você quer fazer é:
def login_required(f):
# This function is what we "replace" hello with
def wrapper(*args, **kw):
args[0].client_session['test'] = True
logged_in = 0
if logged_in:
return f(*args, **kw) # Call hello
else:
return redirect(url_for('login'))
return wrapper
Outras dicas
kwargs
é um dicionário contendo argumento como chaves e valores como valores.
Então tudo que você precisa fazer é verificar:
some_var = kw['my_property']