Я создаю веб-приложение, в котором разные представления будут иметь разное количество «обернутых функций» (например, аутентификация, ведение журнала/обработка ошибок, доступ к базе данных и т. д.) и смогут легко обмениваться этими функциями между представлениями.
Я думаю, что сменные представления были бы хорошим способом справиться с этим, многократно создавая подклассы представлений для создания уровней функциональности, которые обертывают основную работу представления.
Однако я изо всех сил пытаюсь найти лучший способ реализовать это. Я думаю о цепочке декораторов, но наследование, похоже, не работает.
Например, упрощенное представление с некоторыми настраиваемыми журналами и обработкой ошибок:
from flask.views import View
class LoggedView(View):
def __init__(self,template):
self.template=template
#Decorator method for error handling and logging
def log_view(self,view):
def decorator(**kwargs):
try:
#Set up custom logging
self.log = .....
#Execute view
return view(**kwargs)
except CustomApplicationError as e:
#Log and display error
self.log.error(e)
return render_template('error.html',error=str(e))
return decorator
decorators=[log_view]
#This can be overridden for more complex views
def dispatch_request(self):
return render_template(self.template)
Представление можно использовать как:
app.add_url_rule('/index', view_func=LoggedView.as_view('index',template='index.html'))
Затем, если бы я хотел использовать это представление, чтобы также добавить аутентификацию пользователя:
class RestrictedView(LoggedView):
#Decorator method for user access validation
def validate_access(self,view):
def decorator(**kwargs):
g.user=session.get('user')
if g.user is None:
return redirect(url_for('login'))
#Execute view
return view(**kwargs)
return decorator
#How to add this functionality to the decorator chain? e.g. I dont think this works:
decorators.append(validate_access)
Затем я хочу повторить этот подкласс, чтобы добавить дополнительные функции, такие как доступ к базе данных.
- Есть ли лучший способ добиться того, что я пытаюсь сделать?
- Имеет ли смысл использовать декораторы в качестве методов просмотра? Работает ли использование «я» в декораторе?
Любые предложения будут высоко ценится!