Атрибут meta
Атрибут meta класса FlaskForm содержит внутренний класс Meta, который определяет поведение формы. Через этот класс задаются такие настройки, как csrf (включение или отключение CSRF-защиты), csrf_class (класс CSRF-токена), csrf_secret (секретный ключ), model (модель для привязки данных) и другие. Атрибут meta позволяет переопределить эти параметры на уровне конкретной формы, не меняя глобальные настройки приложения.
Синтаксис
class MyForm(FlaskForm):
class Meta:
csrf = True
csrf_class = ...
Пример
Давайте создадим форму и отключим для неё CSRF-защиту через атрибут meta:
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
class MyForm(FlaskForm):
class Meta:
csrf = False
name = StringField('Name')
submit = SubmitField('Send')
@app.route('/', methods=['GET', 'POST'])
def index():
form = MyForm()
if form.validate_on_submit():
return f"Hello, {form.name.data}"
return render_template('index.html', form=form)
Шаблон для вывода формы:
<form method="post">
{{ form.name.label }} {{ form.name() }}
{{ form.submit() }}
</form>
Так как CSRF отключён через meta, форма успешно отправится без скрытого поля с токеном.
Пример
Давайте включим CSRF-защиту и зададим собственный класс токена через атрибут meta:
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.csrf.core import CSRF
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
class MyCSRF(CSRF):
def setup_form(self, form):
pass
def generate_csrf_token(self, csrf_token_field):
return 'token'
def validate_csrf_token(self, form, field):
pass
class MyForm(FlaskForm):
class Meta:
csrf = True
csrf_class = MyCSRF
name = StringField('Name')
submit = SubmitField('Send')
@app.route('/', methods=['GET', 'POST'])
def index():
form = MyForm()
if form.validate_on_submit():
return f"Hello, {form.name.data}"
return render_template('index.html', form=form)
В этом примере через meta указан собственный класс CSRF-защиты MyCSRF, который переопределяет генерацию и проверку токена.
Смотрите также
-
класс
FlaskForm,
который является базовым классом для всех форм -
атрибут
csrf_token,
который хранит CSRF-токен формы -
метод
validate_on_submit,
который проверяет отправку и валидность формы -
метод
hidden_tag,
который выводит скрытые поля формы, включая CSRF-токен