Абонент NewResponse
называется после вашего просмотра.
Вы хотите использовать событие, которое вызывается ранее, например, NewRequest
или ContextFound
. В Pyramid 1.0 вам нужно будет использовать ContextFound
для правильной обработки, потому что вы не можете вызывать исключения в NewRequest
событиях (это исправлено в 1.1).
Способ сделать это с событием ContextFound
- зарегистрировать представление исключений для объектов HTTPException, например:
config.add_view(lambda ctx, req: ctx, 'pyramid.httpexceptions.HTTPException')
По сути, это будет возвращать исключение в качестве объекта ответа при его поднятии, что совершенно верно для объектов HTTPException, которые являются действительными объектами Pyramid Response
.
Затем вы можете зарегистрировать свое мероприятие и провести валидацию CSRF:
@subscriber(ContextFound)
def csrf_validation_event(event):
request = event.request
user = getattr(request, 'user', None)
csrf = request.params.get('csrf_token')
if (request.method == 'POST' or request.is_xhr) and \
(user and user.is_authenticated()) and \
(csrf != unicode(request.session.get_csrf_token())):
raise HTTPUnauthorized