나는 내 질문에 설명 된 어색한 구문을 줄이는 솔루션을 제시했습니다. 나는이 같은 wt.Form
의 내 서브 클래스의 __init__
를 수정 한 : 나는 양식을 만들 때, 나는이 작업을 수행 할 수 있습니다
이제
class MyBaseForm(wt.Form):
class Meta:
csrf = True
csrf_class = SessionCSRF
csrf_secret = settings.SESSION_KEY
csrf_time_limit = timedelta(minutes=60)
def __init__(self, *args, **kwargs):
if "session" in kwargs:
super(MyBaseForm, self).__init__(
*args, meta={'csrf_context': kwargs["session"]}, **kwargs)
else:
super(MyBaseForm, self).__init__(*args, **kwargs)
: 대신 질문에 표시된 어색한 구문의
form = MyForm(session=self.session)
합니다.
게시 된 양식 데이터를 처리하기 위해 처리를 단순화하는 또 다른 기술을 알아 냈습니다. 내가 장식,
def check_csrf(func):
def wrapper(*args, **kwargs):
handler = args[0]
session = handler.session
request = handler.request
f = forms.NoFieldForm(request.POST, session=session)
f.validate()
if f.csrf_token.errors:
msg = "The CSRF token expired. Please try again. "
self.session["msg"] = msg
self.redirect(self.request.path)
else:
func(*args, **kwargs)
return wrapper
셋째 :
class NoFieldForm(MyBaseForm):
pass
둘째, 나는 CSRF를 확인하는 데 사용되는 장식을 만들 첫째
, 나는 CSRF 필드 이외의 필드가있는 양식을 만들 모든 내 POST 핸들러 :
class SomeHandler(webapp2.RequestHandler):
@check_csrf
def post(self):
pass
몇 가지 설명해 드리겠습니다. 데코레이터 (게시자 웹 핸들러 호출을 통해)는 양식 데이터를 수신하지만 CSRF 확인을 위해 CSRF를 제외한 모든 양식 데이터를 버릴 것입니다. 존재하는 다른 폼 데이터를 무시하는 NoFieldForm을 사용하여 일반화 할 수 있습니다. wtforms를 사용하여 CSRF 양식 필드와 세션 토큰이 일치하는지 확인하고 세션 토큰이 만료되지 않았는지 확인합니다.
CSRF가 통과하면 일반적인 처리를 위해 처리기를 호출하여 특정 양식을 처리합니다. CSRF가 실패하면 우리는 핸들러를 전혀 호출하지 않으며, 나의 예에서는 오류 메시지와 함께 우리가 어디로 왔는지 다시 리디렉션합니다.