Как правильно через декоратор передать значение?
Чтобы постоянно не прописывать проверку, решил реализовать это через декоратор:
def is_admin(func):
@functools.wraps(func)
def wraper(*args, **kwargs):
print('<--| ' + func.__name__ + ' |-->')
is_admin.dict_user = { # Вот решил замутить так передачу
'key': 'value'
}
print('is_admin.dict_user.:', is_admin.dict_user)
return func(*args, **kwargs)
return wraper
а потом непосредственно получить данные во вьюхе
@app.route('/page', methods=['GET', 'POST'])
@is_admin
def page():
print('Параметры из <is_admin>: ', is_admin.dict_user) # Вот тут я беру значение
...
Собственно сам вопрос: на сколько это правильно? Можно ли так реализовывать или это из области г**нокода? =)
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
В сам isadmin (функцию, она же декоратор) лучше ничего не пихать. Так у вас параметры глобально общие становятся (т.к. сама функция - по сути глобальная переменная). В принципе лучше не пихать ничего лишнего не в свой объект, в том числе добавлять "левые" поля функциям.
Лучше добавьте в функцию параметр, который декоратор сам будет заполнять.
import functools
def is_admin(func):
@functools.wraps(func)
def wraper(*args, **kwargs):
print('<--| ' + func.__name__ + ' |-->')
dict_user = {
'key': 'value'
}
print('dict_user:', dict_user)
return func(*args, dict_user=dict_user, **kwargs)
return wraper
@is_admin
def page(dict_user):
print('Получено значение dict_user:', dict_user)
page()