Nat*_*and 2 python session flask wtforms
因此,我在将Flask会话对象的列表传递到正在使用的WTForms中时遇到问题。我正在尝试访问会话对象内的“策略”对象(这是一个列表)。
目标是列出与当前用户关联的所有策略。
在Flask应用中:
class Create_Indicator_Form(Form):
security = TextField('Ticker Name', [
validators.Required(),
validators.Length(min=1, max=6)])
mva_10 = BooleanField('10 day moving average')
mva_25 = BooleanField('25 day moving average')
strategy = SelectField('strategy', session['strategy'])
def validate_mva_10(form, field):
if form.mva_25.data is True and field.data is True:
raise ValidationError('You can only choose one reference')
if form.mva_25.data is False and field.data is False:
raise ValidationError('You must choose at least one reference')
@app.route('/create_indicator', methods=['GET', 'POST'])
def create_indicator():
check_if_logged_in()
f = request.form
create_indicator_form = Create_Indicator_Form(f)
if request.method == 'POST' and create_indicator_form.validate():
indicator_id = get_next_index('indicator', 'indicator_id')
ticker = create_indicator_form.security.data
if create_indicator_form.mva_10.data is True:
mva_10_day = 'Y'
mva_25_day = 'N'
else:
mva_10_day = 'N'
mva_25_day = 'Y'
row = [indicator_id, ticker, mva_10_day, mva_25_day]
add_data('indicator', row)
# adding relation
criteria_row = [session['strategy'][0], indicator_id]
add_data('criteria', criteria_row)
return redirect(url_for('home'))
create_indicator_form.strategies = session['strategy']
return render_template('create_indicator.html',
form=create_indicator_form)
Run Code Online (Sandbox Code Playgroud)
当我尝试运行flask应用程序时,抛出此错误:
RuntimeError: working outside of request context
Run Code Online (Sandbox Code Playgroud)
追溯到我在Create_Indicator_Form类中访问会话对象的位置。
自开始尝试解决此问题以来,我已经意识到,使用选择字段在mva_10和mva_25之间进行选择会更有效率,但是我想在重构之前解决此问题。
这是因为该strategy = SelectField('strategy', session['strategy'])行是在加载文件时执行的,因为它是Create_Indicator_Form类定义的一部分。
目前,您确实 working outside of request context
使用班级工厂将在这里工作:
def CreateIndicatorForm():
class IndicatorForm(Form):
security = TextField('Ticker Name', [
validators.Required(),
validators.Length(min=1, max=6)])
mva_10 = BooleanField('10 day moving average')
mva_25 = BooleanField('25 day moving average')
strategy = SelectField('strategy', session['strategy'])
def validate_mva_10(form, field):
if form.mva_25.data is True and field.data is True:
raise ValidationError('You can only choose one reference')
if form.mva_25.data is False and field.data is False:
raise ValidationError('You must choose at least one reference')
return IndicatorForm
Run Code Online (Sandbox Code Playgroud)
请注意,调用会CreateIndicatorForm()返回Form类,因此,要实例化实际的表单,您需要使用:(CreateIndicatorForm()()即“调用”该类,就像创建任何其他类一样)。
实例化表单时,您可以(并且应该)将参数传递给表单构造函数,例如请求数据:CreateIndicatorForm()(request.form)。
另外, session['strategy']在这里对工厂函数进行参数化将是更好的做法-这将使工厂在请求上下文之外可重用,并确保您不必为每个请求都创建新的表单类。