繁体   English   中英

将会话数据从Flask传递到WTForms

[英]Passing in Session data from Flask to 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)

当我尝试运行flask应用程序时,抛出此错误:

RuntimeError: working outside of request context

追溯到我在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

请注意,调用CreateIndicatorForm()返回一个Form类 ,因此要实例化一个实际表单,您需要使用: CreateIndicatorForm()() (即“调用”该类,就像创建其他新实例一样)。

实例化表单时,可以(并且应该)将参数传递给表单构造函数,例如请求数据: CreateIndicatorForm()(request.form)


另外,在此处将session['strategy']作为工厂函数的参数将是更好的做法-这将使工厂在请求上下文之外可重用,并确保您不必为每个单个请求创建新的表单

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM