1

ユーザーが設定した間隔で実行するように Python スクリプトを設定できるようにするアプリケーションを作成しています。APSCheduler を SQLAlchemy と組み合わせてデータ ソースとして使用し、Flask を Web UI に使用しています。

ジョブを設定するための次のマークアップを含む画面があります。

<form method="POST">
    <input type="text" name="JobDesc">
    <input type="text" name="function">
    <input type="text" name="args">
    <input type="text" name="kwargs">
    <select name="trigger">
        <option value="interval" selected>Interval</option> <!--Adding other job types later-->
    </select>
    <input type="number" name="minutes">
    <select name="coalesce">
        <option value=1>True</option>
        <option value=0 selected>False</option>
    </select>
    <input type="submit">
</form>

このフォームの「送信」ボタンは、以下のスクリプトをトリガーして、レコードをデータベースに追加します

@app.route('/addjob', methods=['GET', 'POST'])
def JobConfig():
    if flask.request.method == 'POST':

        if flask.request.form['args'] == '': # '' == None returns False. :(
            args = None
        else:
            args = flask.request.form['args']

        if flask.request.form['kwargs'] == '':
            kwargs = None
        else:
            print(flask.request.form['kwargs'])
            kwargs = flask.request.form['kwargs']

        scheduler.add_job(
            trigger=str(flask.request.form['trigger']),
            func=str(flask.request.form['function']),
            minutes=int(flask.request.form['minutes']),
            coalesce=bool(flask.request.form['coalesce']),
            args=args,
            kwargs=kwargs,
            name=str(flask.request.form['JobDesc']),
        )

        return 'Success', 201
    elif flask.request.method == 'GET':
        return flask.render_template('JobEntry.html')
    else:
        return flask.abort(400)

APScheduler にはいくつかの重要なフィールドがあります。

  • 関数: スケジュールする関数の詳細 (例: JOBS.TestJob:Test は、JOBS フォルダーの Testjob.py ファイルでテスト関数を実行します)。
  • args: 関数に提供する関数のリスト。
  • kwargs: 関数に提供する関数の辞書。

残念ながら、args と kwargs が空白の場合、入力画面は正常に機能しますが、引数を入力しようとするとエラーが発生します。たとえば、Test 関数が引数 "Abbrev" を想定していて、{"Abbrev":"Test1"} を kwargs フィールドに入力するとします。

File "C:\Python34\lib\site-packages\apscheduler\schedulers\base.py", line 334, in add_job
'kwargs': dict(kwargs) if kwargs is not None else {},
ValueError: dictionary update sequence element #0 has length 1; 2 is required

誰かが私を正しい方向に向けることができますか? データを送信するためにバニラ HTTP POST リクエスト (JSON?) 以外のものを使用する必要がある場合、これが私の python のエラーであるかどうかはわかりません。

4

1 に答える 1

1

これは実際、JSON 入力でうまく機能します。エラーが示すように、「kwargs」引数として dict を指定し、「args」引数としてタプルまたはリストを指定する必要があります。または、kwargs を解析して自分で dict にすることもできますが、必要に応じて行うことができます。

于 2014-11-10T23:30:15.993 に答える