【问题标题】:How to send data from JavaScript to Python如何将数据从 JavaScript 发送到 Python
【发布时间】:2018-04-04 00:37:25
【问题描述】:

我在 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 数据?

【问题讨论】:

  • https://firststep-2016.appspot.com/User_update 链接给出 500 内部服务器错误,看起来你的 python 代码有问题
  • 我觉得jsonData = json.loads(self.get('data'))应该改成jsonData = json.loads(self.request.get('data'))
  • 我们希望获得比我的代码无效的更多信息,请参阅 this link 了解如何在 stackoverflow 上提问
  • Anuj : 我已经试过了。

标签: javascript python google-app-engine


【解决方案1】:

HTTP 方法

首先最好了解通信的一般运作方式。

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

在这种情况下为您提供的相关方法:

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

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

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

通过 jQuery 的 ajax 向服务器发送数据

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

作为data 属性的文档:

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

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

此时您可以使用浏览器的开发者工具来检查网络请求。这样您就可以看到发送到服务器的具体内容。

在服务器中接收数据

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

您应该能够像这样获取单个值(不会有“数据”参数):

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

对于 PUTPOST,它应该像这样工作 (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的攻击

这不是您问题的一部分,但很严重。我不会在公共服务器上提供该代码,如果现在可以,我会在修复之前将其删除。

【讨论】:

    【解决方案2】:

    您似乎正在尝试使用错误的方法发布数据。您应该使用 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):
        ....
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2018-01-15
      • 2012-08-11
      • 2020-09-27
      • 2021-08-23
      • 2018-11-16
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      相关资源
      最近更新 更多