Python中如何处理Ajax请求的问题?

在 django 中,前端发送了数据,我后台返回了{‘ res ’:0},在前端 response 中也接受到了,为什么 ajax 一直走 err 啊?是返回格式不对吗,应该在哪改啊?谢谢了
Python中如何处理Ajax请求的问题?

24 回复

json 应该用双引号


在Python后端处理Ajax请求,核心是解析前端发送的JSON数据并返回JSON响应。以Flask框架为例,你需要做三件事:

  1. 接收请求:使用request.get_json()获取前端通过Ajax发送的JSON数据。
  2. 处理数据:像处理普通请求一样执行业务逻辑。
  3. 返回响应:用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

回到顶部