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 有许多关键字段:

  • 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?)以外的东西来发送数据。

4

1 回答 1

1

对于 JSON 输入,这确实会更好。正如错误所暗示的那样,您需要将 dict 作为“kwargs”参数,将元组或列表作为“args”参数。或者,您可以根据自己的意愿将 kwargs 解析为 dict。

于 2014-11-10T23:30:15.993 回答