ユーザーが設定した間隔で実行するように 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 のエラーであるかどうかはわかりません。