我在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数据?
答案 0 :(得分:1)
首先,了解通信的工作原理是很好的。
HTTP有各种方法,例如GET和POST(参见https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol)。
在这种情况下,您的相关方法:
GET 适用于只读请求。与其他HTTP方法不同,GET请求不携带包含发送到服务器的数据的主体。所有数据都将通过URL参数发送。在某些情况下也作为标题的一部分。 GET请求可以重复或缓存,因为它们是只读的。这就是他们不应该用于更新的原因。
POST 和 PUT 可以更新数据,通常 POST 用于创建对象,而 PUT 用于更新现有对象。两种HTTP方法都接受带有数据的正文。
由于您要更新用户, PUT 似乎是合适的。
大多数开发人员可能会假设它,但值得列出所有直接依赖项,在这种情况下,您似乎使用jQuery来获取值并将请求发送到服务器。特别是$.ajax
:http://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):
....