Python中如何处理Ajax请求的问题?
在 django 中,前端发送了数据,我后台返回了{‘ res ’:0},在前端 response 中也接受到了,为什么 ajax 一直走 err 啊?是返回格式不对吗,应该在哪改啊?谢谢了
Python中如何处理Ajax请求的问题?
json 应该用双引号
在Python后端处理Ajax请求,核心是解析前端发送的JSON数据并返回JSON响应。以Flask框架为例,你需要做三件事:
- 接收请求:使用
request.get_json()获取前端通过Ajax发送的JSON数据。 - 处理数据:像处理普通请求一样执行业务逻辑。
- 返回响应:用
jsonify()将Python字典转为JSON响应,并确保设置正确的状态码。
这里是一个完整的示例:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/ajax_endpoint', methods=['POST'])
def handle_ajax():
# 1. 获取前端发送的JSON数据
data = request.get_json()
if not data:
# 如果数据为空或不是JSON,返回错误
return jsonify({'error': 'Invalid JSON'}), 400
# 2. 处理业务逻辑(这里只是简单示例)
name = data.get('name', 'Guest')
processed_data = f"Hello, {name}! Request received."
# 3. 返回JSON响应
return jsonify({
'message': processed_data,
'received_data': data
}), 200
if __name__ == '__main__':
app.run(debug=True)
对应的前端jQuery Ajax调用示例:
$.ajax({
url: '/ajax_endpoint',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({name: 'John', age: 30}),
success: function(response) {
console.log(response.message);
}
});
关键点:
- 方法限制:路由要明确指定
methods=['POST'](或其他HTTP方法)。 - 内容类型:前端必须设置
contentType: 'application/json'。 - 数据格式:前端要用
JSON.stringify()将对象转为JSON字符串。 - 错误处理:后端要检查
request.get_json()是否返回None,并处理可能的JSON解析错误。
如果用Django,思路类似,用json.loads(request.body)获取数据,用JsonResponse返回响应。
总结:前后端约定好数据格式,后端用对应方法解析和返回JSON即可。
谢谢,但他还是走 err 我返回的 data 是个 object,但一旦打印 data.res 他就显示 undefined,我觉得是返回的格式不对,但是不知道怎么改
跨域了?
在 F12 页面上没显示有跨域的问题…
返回没指定 mime ?
或者 js 里面先 序列化一下。
jQuery.parseJSON(jsonstr),
用 postman 跑一下试试?
后端指定 contenttype text/json
放代码啊 ,难道靠猜吗?不放代码来截图也行啊
不给代码确实已经没法帮你了。
你是在外面打印的吧?要把 async 设置为 false,默认是异步执行请求的。
这是 ajax:
$(function(){
$(’#send-btn’).click(function(){
$.ajax({
url:‘http://127.0.0.1:8000/laoguo/’,
type:‘get’,
data:{‘name’:‘laoguo’},
dataType:‘jsonp’,
success:function(data){
if(data.res == 0){
alert(‘get’)
}else{
alert(’…’)
}
},
error:function(data){
alert(data.res)
}
})
})
})
这是 django 的 view:
def test(request):
if request.method == “GET”:
name = request.GET.get(“name”)
print(name)
return JsonResponse({“res”:0})
else:
name = request.POST.getlist(“name”)
print(name)
return JsonResponse({“res”:1})
看下控制台有没有报错
jquery ?改成下面这样然后设个断点调试下
error: function(data, status, error){
}
总过先看看什么错咯
返回的数据格式不对,你这个是 jsonp,需要后台处理下,比如 fn_cb({“res”: 0}),不能直接返回 json
fn_cb 是什么…我也觉得是数据格式不对
如果你确实知道是要用 JSONP,那么不能直接返回 JSON,而且 url 也写错了。
https://segmentfault.com/a/1190000008445998
fn_cb 是任意函数名,jsonp 是在前台定义一个函数,后台返回一段 js 代码调用这个函数并传入数据,以此来实现跨域,jquery 应该对返回的数据做了校验,后台返回的数据格式不对,所以进了 err
dataType 属性值改成 JSON 试试
另外针对跨域,个人倾向于优先选择 CORS: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
$.ajax(
…
datatype: ‘text’,
success: console.log,
error: console.error
);
因为你后台返回的数据格式不一定处理正确了,所以这里用datatype: 'text',如果可以行得通,
再使用:
$.ajax(
…
datatype: ‘json’,
success: console.log,
error: console.error
);
应该问题可以解决了。
改了后现在服务器端报 500 错误…
def test(request):
if request.method == “GET”:
name = request.GET.get(“name”)
print(name)
return HttpResponse(“func({‘res’:0})”)
else:
name = request.POST.get(“name”)
print(name)
return HttpResponse(“func({‘res’:1})”)
$.ajax({
url:‘http://127.0.0.1:8000/laoguo/’,
type:‘get’,
data:{‘name’:‘laoguo’},
dataType:‘jsonp’,
success:function func(data){
if(data.res == 0){
alert(‘get’)
}else{
alert(‘error’)
}
},
error:function func(data){
alert(data.res)
}
})
你直接搜索关键字 django jsonp
jsonp 技术有点老了,建议 cors

