我正在编写一个应用程序,它允许用户设置 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 有许多关键字段:
- Function:要调度的函数的详细信息(例如:JOBS.TestJob:Test运行JOBS文件夹下Testjob.py文件中的Test函数)。
- args:提供给函数的函数列表。
- kwargs:提供给函数的函数字典。
不幸的是,当 args 和 kwargs 为空白时,虽然输入屏幕工作正常,但如果您尝试输入任何参数,我会收到错误消息。例如,如果我的 Test 函数需要一个参数“Abbrev”并且我在 kwargs 字段中输入 {"Abbrev":"Test1"}:
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
有人能指出我正确的方向吗?我不确定这是否是我的 python 中的错误,我是否需要使用普通 HTTP POST 请求(JSON?)以外的东西来发送数据。