如何将数据从JavaScript发送到Python

时间:2017-10-23 12:46:57

标签: javascript python google-app-engine

我在jinja2和python2.7上使用GAE进行Web开发

我可以从Python获取数据。但我无法将数据从JavaScript发送到Python。这是JavaScript代码:

function toSave() {
    var val_no = $('#field-no').val();
    var val_name = $('#field-name').val();
    var val_address = $('#field-address').val();
    var val_phone = $('#field-phone').val();
    var val_car = $('#field-car').val();
    var val_penalty = $('#field-penalty').val();

    $.ajax({
        type: 'GET',
        url: "https:/test/User_update",
        data: {
            "no": val_no,
            "name": val_name,
            "address": val_address,
            "phone": val_phone,
            "car": val_car,
            "penalty": val_penalty
        },
        dataType: "json"
    }).done(function () {
        $('#modal-1').modal('hide');
        table.row.data([val_no, val_name, val_address, val_phone, val_car, val_penalty, UserIndex_CreateEditButton(val_no, val_name, val_address, val_phone, val_car, val_penalty), UserIndex_CreateDeleteButton(val_no)], $('#' + tempUpdate));
    });
}

Python代码(main.py中的类User_update):

import os
import webapp2
import MySQLdb
import json
import logging
import googlemaps
import jinja2
import sys
import urllib
import urllib2
import json as simplejson
import codecs

reload(sys)
sys.setdefaultencoding('utf-8')
from operator import eq
from datetime import datetime
from collections import OrderedDict

class User_update(webapp2.RequestHandler):
def get(self):

    jsonData = json.loads(self.get('data'))

#   penalty = self.request.get('data')

#   phone = urllib.request.urlopen(req).read() 
#   data = urllib.requset.urlopen("http://www.daum.net").read()
#   phone=urllib2.urlopen("https://firststep-2016.appspot.com/Log").read()  

    self.response.headers['Content-Type']='text/plain'

    db = connect_to_cloudsql()
    cursor = db.cursor()
    cursor.execute("SET names utf8")
    cursor.execute('SET SQL_SAFE_UPDATES=0;')
    cursor.execute("""update User set name='%s',address='%s',phone='%s',car_num='%s',penalty='%s' where no='%s' """%(jsonData.name,jsonData.address,jsonData.phone,jsonData.car,jsonData.penalty,jsonData.no))
    db.commit()
    db.close()

如何从Python获取JavaScript数据?

2 个答案:

答案 0 :(得分:1)

HTTP方法

首先,了解通信的工作原理是很好的。

HTTP有各种方法,例如GET和POST(参见https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol)。

在这种情况下,您的相关方法:

  • GET 适用于只读请求。与其他HTTP方法不同,GET请求不携带包含发送到服务器的数据的主体。所有数据都将通过URL参数发送。在某些情况下也作为标题的一部分。 GET请求可以重复或缓存,因为它们是只读的。这就是他们不应该用于更新的原因。

  • POST PUT 可以更新数据,通常 POST 用于创建对象,而 PUT 用于更新现有对象。两种HTTP方法都接受带有数据的正文。

由于您要更新用户, PUT 似乎是合适的。

通过jQuery' ajax

将数据发送到服务器

大多数开发人员可能会假设它,但值得列出所有直接依赖项,在这种情况下,您似乎使用jQuery来获取值并将请求发送到服务器。特别是$.ajaxhttp://api.jquery.com/jQuery.ajax/

作为data属性的文档:

要发送到服务器的数据。如果不是字符串,它将转换为查询字符串。它附加到GET请求的URL。

即使 GET 不接受正文,jQuery也会将其添加到网址中。如前所述,我建议不要使用 GET 进行更新。

此时,您可以使用浏览器的开发人员工具来检查网络请求。这样你就会看到究竟是什么发送到服务器。

在服务器中接收数据

我相信您使用的API是:http://webapp2.readthedocs.io/en/latest/guide/handlers.html

您应该能够获得这样的个别值(这不会成为'数据'参数):

val_no = self.request.get("no")
val_name = self.request.get("name")
# ...

对于 PUT POST ,它应该像这样(http://webapp2.readthedocs.io/en/latest/guide/request.html#post-data):

val_no = self.request.POST['no']
val_name = self.request.POST['name']
# ...

安全

您的服务器代码容易受到https://en.wikipedia.org/wiki/SQL_injection

的攻击

这不是你问题的一部分,但非常严重。我不会在公共服务器上提供该代码,如果现在我将删除它直到修复。

答案 1 :(得分:0)

看起来您正在尝试使用错误的方法发布数据。您应该使用POST而不是GET将数据发送到服务器

$.ajax({
    type: 'POST',
    url: "https://firststep-2016.appspot.com/User_update",
    data: {
        "no": val_no,
        "name": val_name,
        "address": val_address,
        "phone": val_phone,
        "car": val_car,
        "penalty": val_penalty
    },
    dataType: "json"
}).done(function () {
    $('#modal-1').modal('hide');
    table.row.data([val_no, val_name, val_address, val_phone, val_car, val_penalty, UserIndex_CreateEditButton(val_no, val_name, val_address, val_phone, val_car, val_penalty), UserIndex_CreateDeleteButton(val_no)], $('#' + tempUpdate));
});

然后处理Python服务器中的传入数据

def post(self):
    ....