【问题标题】:Posting a python dictionary as an entered field on a form将 python 字典作为输入字段发布到表单上
【发布时间】:2014-11-10 17:44:58
【问题描述】:

我正在编写一个应用程序,它允许用户设置 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?)以外的东西来发送数据。

【问题讨论】:

    标签: post python-3.x flask apscheduler


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答亚历克斯,我现在已经做好了准备。也感谢制作 APScheduler,我现在掌握了它,我必须说我发现它非常有用。 :)
    猜你喜欢
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2014-01-04
    • 2023-03-04
    • 2016-07-25
    • 2019-08-26
    相关资源
    最近更新 更多