【问题标题】:How to post form data via ajax to a python script?如何通过 ajax 将表单数据发布到 python 脚本?
【发布时间】:2013-09-29 11:09:43
【问题描述】:

我正在为一个 python 程序和一个 ajax 请求而苦苦挣扎。我试图从我的 Javascript 中获取一些数据到 python 程序中,我一直使用的正常方法 .getfirst(field name) 不起作用,我认为是因为请求是通过 ajax (对不起,我是这一切都很新)所以我尝试使用以下代码

Python:

import MySQLdb
import cgi, cgitb

def index(req):

    # Create instance of FieldStorage
    form = cgi.FieldStorage()

    # Get data from fields
    dtbox = form.getvalue('dt')
    tmbox = form.getvalue('tm')

    con = MySQLdb.connect('localhost', 'root', '', 'mydb')

    with con:
        cur = con.cursor(MySQLdb.cursors.DictCursor)
        s = "SELECT tmp, watts FROM currentcost WHERE dt ='" + dtbox + "' and tm like '" + tmbox + "%'"
        cur.execute (s)
        rows = cur.fetchall()

        x=""
        y=""
        for row in rows:
            x=x+row["watts"]+","
            y=y+row["tmp"]+","

    x="data:["+x+"]"
    y="data:["+y+"]"

    con.close()

    req.write(x)

Javascript sn-p:

function draw(handleResponse) {
    $.ajax({
        url: "/currentcost.py",
        data: {dt: frm.dt, tm: frm.tm},
        success: function(response){
            handleResponse(response);
        }
    });

<form name="frm" target="ifrm">
    <iframe name="ifrm" id="ifrm" style="display:none"></iframe>
        <fieldset style="width:300px">
            <legend>Chart Date and Time</legend>
            Alter the date and time settings <br>
            Date:
            <select name="dt">

我希望将表单值 dt 和 tm 传输到 python 程序,它将从中挑选出来并运行我的选择查询...我得到的只是一个空白:-(

感谢您的帮助

克里斯

【问题讨论】:

  • 我已经修复了您问题中的格式。并请了解 Java 和 Javascript 之间的区别。
  • 您似乎没有在 JS 中定义 frm。它是在其他地方定义的吗?你应该显示在哪里。
  • 这与您的 Javascript 问题无关,但您当前的代码容易受到 SQL 注入的攻击。
  • @Daniel 抱歉,一定是太着急了,我明白 Java 和 Javascript 之间的区别。我在上面编辑了我的代码并添加了几行引用表单定义的行(我没有将整个页面包含在内)。我想我已经这样做了很长时间了,现在我看不到树木了!!任何帮助将不胜感激
  • @Andre 谢谢,我什至还没有看过 SQL 注入问题,因为它在我的 Raspberry PI 上运行它并不是一个重要的优先事项,但我同意你的观点,一旦工作我需要看看这些点。谢谢

标签: javascript python ajax


【解决方案1】:

您的 ajax 调用应该是"POST" 类型,您可以使用.serialize() 序列化表单中的字段。

$.ajax({
    url: "/currentcost.py",
    type: "POST",
    data: $("form[name='frm']").serialize(),
    success: function(response){
        handleResponse(response);
    }
});

编辑

您通常不应该使用 GET 请求来提交表单。也就是说,ajax GET 应该如下所示:

 $.ajax({
    url: "/currentcost.py",
    data: {dt: $("#dt").val(), tm: $("#tm").val() },
    success: function(response){
        handleResponse(response);
    }
 });

这假设您已将属性id="dt" 插入到第一个元素中,并将id="tm" 插入到第二个元素中。

【讨论】:

  • 谢谢,它是那些日子之一。前一步后退两步!我添加了您的建议,但现在 .py 正在返回“方法未实现”......有什么想法吗?
  • 你在使用 apache 和 mod_python 吗?我问的原因是因为做def indexreq.write 似乎是apache 术语而不是python 和CGI。
  • 是的,我正在使用 apache2 和 mod_python。老实说,我是通过互联网学习这一点的,并结合我对 Windows 和 VB 的传统知识,拼凑代码!
  • 如果我删除 POST 行并将数据行更改为“12345”,我现在得到的错误是 TypeError: cannot concatenate 'str' and 'NoneType' 但我可以看到传递的命令行是 currentcost .py?12345。有没有办法在python脚本中解析数据并自己构造数据线?
  • 显然在 mod_python 的旧版本中存在一个已知的 ajax POST 问题,该问题已在 mod_python 3.2.10 或更高版本中修复。你用的是什么版本?
猜你喜欢
  • 2014-09-18
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2014-01-04
相关资源
最近更新 更多