2

そのため、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)

フラスコアプリを実行しようとすると、次のエラーがスローされます。

RuntimeError: working outside of request context

Create_Indicator_Form クラスのセッション オブジェクトにアクセスした場所までさかのぼってトレースします。

これを修正しようとして以来、選択フィールドで mva_10 と mva_25 の間で選択する方が効率的であることに気付きましたが、リファクタリングする前にこの問題を解決したいと思います。

4

1 に答える 1

5

どうして

これは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

呼び出すとForm クラスCreateIndicatorForm()が返されるので、実際のフォームをインスタンス化するには、以下を使用する必要があることに注意してください(つまり、他のクラスで新しいインスタンスを作成する場合と同様に、クラスを「呼び出し」ます)。CreateIndicatorForm()()

フォームをインスタンス化するとき、リクエスト データなどの引数をフォーム コンストラクターに渡すことができます (そして渡す必要があります) CreateIndicatorForm()(request.form)


また、session['strategy']ここではファクトリ関数の引数を作成することをお勧めします。これにより、リクエスト コンテキストの外部でファクトリを再利用できるようになり、リクエストごとに新しいフォームクラスを作成する必要がなくなります。

于 2013-04-09T17:42:29.727 に答える