Не удается опубликовать данные формы Flask для тестирования (FieldList) [DeprecationWarning]
Я пишу несколько разных форм колб. До сих пор я проверял маршруты, которые я использую с этими формами.
- Создание объекта формы
- Заполнение формы
- Размещение данных формы
Например, это работает (краткая версия класса):
class RequestForm(FlaskForm):
project = SelectField(label='Project', id='project', coerce=str)
name = StringField('Environment Name', id='env_name', validators=[DataRequired()])
requested_by = StringField('Requested By', validators=[DataRequired()])
tag = StringField('Tag')
required_from = DateField('Required From', format='%Y-%m-%d', validators=[DataRequired()])
required_to = DateField('Required To', format='%Y-%m-%d', validators=[Optional()])
И при тестировании:
def test_post_full_request_is_correct(self):
with self.app.test_client() as http_client:
self.login(http_client)
required_from = str(datetime.datetime.today().date() + datetime.timedelta(days=1))
form = RequestForm()
form.project.data = 'SO'
form.name.data = 'TEST02'
form.requested_by.data = 'dev01'
form.required_from.data = required_from
form.env_type.data = 'DEV'
form.location.data = 'Narnia'
form.size.data = 'L'
form.resilience.data = '0'
form.submit.data = True
response = http_client.post('/request', data=form.data)
Это отлично работает.
Тем не менее, я также получил эти формы. Основное существо RequestsComponentsForm
,
class RequestComponentForm(FlaskForm):
component = StringField('Name', validators=[DataRequired()])
source = SelectField('Source', choices=[('nexus', 'Nexus')])
version = StringField('Version')
def __init__(self, *args, **kwargs):
kwargs['csrf_enabled'] = False
super(RequestComponentForm, self).__init__(*args, **kwargs)
class RequestComponentsForm(FlaskForm):
components = FieldList(FormField(RequestComponentForm))
submit = SubmitField('Request Environment')
Работает как брелок при тестировании вручную. Однако, когда я попробовал автоматизированное тестирование:
c_form = RequestComponentsForm()
components = ['app-a', 'app-b', 'app-c', 'app-d', 'app-e', 'app-f']
test_versions = ['1.2.3', '3.2.1', '2.1.3', '5.7.1', '3.6.3', '1.4.6']
for c, v in zip(log_design_components, test_versions):
entry = RequestComponentForm()
entry.component = c
entry.source = 'nexus'
entry.version = v
c_form.components.append_entry(entry)
response = http_client.post('/request{0}components'.format(env_request_id),
headers={'Referer': good_referrer},
data=c_form.data)
Я получаю следующее:
venv/lib/python3.6/site-packages/werkzeug/test.py:349: DeprecationWarning: it's no longer possible to pass dicts as `data`. Use tuples or FileStorage objects instead.
Я не понимаю, почему мой подход к тестированию первой формы работает, а такой же подход для второй - нет.
Любая помощь будет принята с благодарностью.
Спасибо!
Обновить
Вот как выглядят данные первой формы:
{
'project': 'SO',
'name': 'TEST02',
'requested_by': 'dev01',
'tag': '',
'required_from': '2018-07-11',
'required_to': None,
'monday_on': None,
'monday_off': None,
'tuesday_on': None,
'tuesday_off': None,
'wednesday_on': None,
'wednesday_off': None,
'thursday_on': None,
'thursday_off': None,
'friday_on': None,
'friday_off': None,
'saturday_on': None,
'saturday_off': None,
'sunday_on': None,
'sunday_off': None,
'env_type': 'DEV',
'location': 'Narnia',
'size': 'L',
'resilience': '0',
'submit': True
}
И второе:
{
'components': [
{
'component': 'app-a',
'source': 'nexus',
'version': '1.2.3'
},
{
'component': 'app-b',
'source': 'nexus',
'version': '3.2.1'
},
{
'component': 'app-c',
'source': 'nexus',
'version': '2.1.3'
},
{
'component': 'app-d',
'source': 'nexus',
'version': '5.7.1'
},
{
'component': 'app-e',
'source': 'nexus',
'version': '3.6.3'
},
{
'component': 'app-f',
'source': 'nexus',
'version': '1.4.6'
}
],
'submit': True
}
Они оба словари, так что я действительно не понимаю, почему первый будет работать, а другой - нет.
1 ответ
FieldList - это удобная оболочка группы полей в WTF. При публикации данных следует использовать исходную форму, для второй формы полезная нагрузка должна быть следующей:
{
'components-0-component': 'app-a',
'components-0-source': 'nexus',
'components-0-version': '1.2.3',
'components-1-component': 'app-b',
'components-1-source': 'nexus',
'components-1-version': '3.2.1',
...
}