Python Flask WTForms - Создание динамических c радиоэлементов, работающих некорректно - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть следующий код для генерации списка устройств воспроизведения, возвращаемых из Spotify API:

class SpotifyForm(FlaskForm):
    pass

json_response = response.json()
devicelist = json_response['devices']

devices = {}
for i in range(0, len(devicelist)):
    devices[devicelist[i]['id']] = devicelist[i]['name']

for device in devices:
    choices.append((device, devices[device]))

setattr(SpotifyForm, 'device', RadioField("device", choices=choices))
setattr(SpotifyForm, 'submit', SubmitField('Submit'))

form = SpotifyForm()
if form.validate_on_submit():
    session['spotify_device'] = form.device.data
    return redirect(url_for('index'))

Список создан правильно, и он отлично работает в моей рабочей среде flask. Однако, как только я перехожу на рабочий сервер (Gunicorn), я получаю следующую трассировку ошибки:

Exception on /spotify [POST]
Traceback (most recent call last):
  File "/home/composerexplorer/composer-explorer/venv/lib/python3.6/site-packages/flask/app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/composerexplorer/composer-explorer/venv/lib/python3.6/site-packages/flask/app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/composerexplorer/composer-explorer/venv/lib/python3.6/site-packages/flask/app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/composerexplorer/composer-explorer/venv/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/composerexplorer/composer-explorer/venv/lib/python3.6/site-packages/flask/app.py", line 1949, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/composerexplorer/composer-explorer/venv/lib/python3.6/site-packages/flask/app.py", line 1935, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/composerexplorer/composer-explorer/app/routes.py", line 373, in spotify
    session['spotify_device'] = form.device.data
AttributeError: 'SpotifyForm' object has no attribute 'device'

По какой-то причине я получаю эту ошибку один или два раза, но затем, если я продолжаю в ней, ошибка уходит и форма отправляется правильно. Есть идеи?

1 Ответ

0 голосов
/ 02 апреля 2020

Я думаю, что вы должны делать что-то подобное при объявлении класса формы:

class SpotifyForm(FlaskForm):
    device = SelectField(choices=my_choices)
    submit = SubmitField('Submit')

Кроме того, я думаю, что вы должны получать доступ к данным через form.data

...