推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bmcjxhgwy
V2EX  ›  Python

问个 ajax 的问题,谢谢帮助

  •  
  •   bmcjxhgwy · Mar 3, 2018 · 4441 views
    This topic created in 3015 days ago, the information mentioned may be changed or developed.
    在 django 中,前端发送了数据,我后台返回了{‘ res ’:0},在前端 response 中也接受到了,为什么 ajax 一直走 err 啊?是返回格式不对吗,应该在哪改啊?谢谢了
    28 replies    2018-03-04 15:28:26 +08:00
    liuxu
        1
    liuxu  
       Mar 3, 2018 via Android
    json 应该用双引号
    bmcjxhgwy
        2
    bmcjxhgwy  
    OP
       Mar 3, 2018
    谢谢,但他还是走 err 我返回的 data 是个 object,但一旦打印 data.res 他就显示 undefined,我觉得是返回的格式不对,但是不知道怎么改
    gongpeione
        3
    gongpeione  
       Mar 3, 2018
    跨域了?
    bmcjxhgwy
        4
    bmcjxhgwy  
    OP
       Mar 3, 2018
    在 F12 页面上没显示有跨域的问题.....
    bmcjxhgwy
        5
    bmcjxhgwy  
    OP
       Mar 3, 2018
    我用了 jsonp 应该不会有跨域的请求..
    loading
        6
    loading  
       Mar 3, 2018 via iPhone
    返回没指定 mime ?
    或者 js 里面先 序列化一下。

    jQuery.parseJSON(jsonstr),
    bmcjxhgwy
        7
    bmcjxhgwy  
    OP
       Mar 3, 2018
    序列化了好像也没什么用.....
    bxb100
        8
    bxb100  
       Mar 3, 2018 via Android
    前端用()拼接试试
    Yunhao
        9
    Yunhao  
       Mar 3, 2018 via iPhone
    用 postman 跑一下试试?
    dinggk
        10
    dinggk  
       Mar 3, 2018 via Android
    后端指定 contenttype text/json
    summerwar
        11
    summerwar  
       Mar 3, 2018
    放代码啊 ,难道靠猜吗?不放代码来截图也行啊
    loading
        12
    loading  
       Mar 3, 2018 via iPhone
    不给代码确实已经没法帮你了。
    Danielfile
        13
    Danielfile  
       Mar 3, 2018 via Android
    你是在外面打印的吧?要把 async 设置为 false,默认是异步执行请求的。
    bmcjxhgwy
        14
    bmcjxhgwy  
    OP
       Mar 3, 2018
    这是 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})
    misaka19000
        15
    misaka19000  
       Mar 3, 2018
    看下控制台有没有报错
    xy90321
        16
    xy90321  
       Mar 3, 2018
    jquery ?改成下面这样然后设个断点调试下
    error: function(data, status, error){
    }
    总过先看看什么错咯
    sublime
        17
    sublime  
       Mar 3, 2018
    返回的数据格式不对,你这个是 jsonp,需要后台处理下,比如 fn_cb({"res": 0}),不能直接返回 json
    bmcjxhgwy
        18
    bmcjxhgwy  
    OP
       Mar 3, 2018
    @sublime fn_cb 是什么....我也觉得是数据格式不对
    brickyang
        19
    brickyang  
       Mar 3, 2018
    如果你确实知道是要用 JSONP,那么不能直接返回 JSON,而且 url 也写错了。

    https://segmentfault.com/a/1190000008445998
    sublime
        20
    sublime  
       Mar 3, 2018
    @bmcjxhgwy fn_cb 是任意函数名,jsonp 是在前台定义一个函数,后台返回一段 js 代码调用这个函数并传入数据,以此来实现跨域,jquery 应该对返回的数据做了校验,后台返回的数据格式不对,所以进了 err
    brickyang
        21
    brickyang  
       Mar 3, 2018
    另外针对跨域,个人倾向于优先选择 CORS: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    leamtrop
        22
    leamtrop  
       Mar 3, 2018 via Android
    dataType 属性值改成 JSON 试试
    bmcjxhgwy
        23
    bmcjxhgwy  
    OP
       Mar 3, 2018
    zhuzhuyule
        24
    zhuzhuyule  
       Mar 3, 2018
    $.ajax(
    ....
    datatype: 'text',
    success: console.log,
    error: console.error
    );

    因为你后台返回的数据格式不一定处理正确了,所以这里用`datatype: 'text'`,如果可以行得通,
    再使用:

    $.ajax(
    ....
    datatype: 'json',
    success: console.log,
    error: console.error
    );

    应该问题可以解决了。
    bmcjxhgwy
        25
    bmcjxhgwy  
    OP
       Mar 3, 2018
    @sublime 改了后现在服务器端报 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)
    }
    })
    sublime
        26
    sublime  
       Mar 3, 2018 via iPhone
    @bmcjxhgwy 你直接搜索关键字 django jsonp
    g8287694
        27
    g8287694  
       Mar 4, 2018
    我记得 jsonp 的返回值是有时间戳的吧?
    zhwithsweet
        28
    zhwithsweet  
       Mar 4, 2018 via iPhone
    jsonp 技术有点老了,建议 cors
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   942 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 20:22 · PVG 04:22 · LAX 13:22 · JFK 16:22
    ♥ Do have faith in what you're doing.