Python Flask WTForms-创建动态无线电元素,工作不一致



我有以下代码来生成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'))

该列表生成正确,在我的生产烧瓶环境中运行良好。然而,一旦我转移到生产服务器(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'

出于某种原因,我会出现一两次错误,但如果我坚持下去,错误就会消失,表单也会正确提交。有什么想法吗?

我认为在声明表单类时应该这样做

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

此外,我认为您应该通过form.data访问数据

最新更新