V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2018-03-03 20:14:21 +08:00 · 3513 次点击
    这是一个创建于 2459 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 django 中,前端发送了数据,我后台返回了{‘ res ’:0},在前端 response 中也接受到了,为什么 ajax 一直走 err 啊?是返回格式不对吗,应该在哪改啊?谢谢了
    28 条回复    2018-03-04 15:28:26 +08:00
    liuxu
        1
    liuxu  
       2018-03-03 20:16:50 +08:00 via Android
    json 应该用双引号
    bmcjxhgwy
        2
    bmcjxhgwy  
    OP
       2018-03-03 20:23:43 +08:00
    谢谢,但他还是走 err 我返回的 data 是个 object,但一旦打印 data.res 他就显示 undefined,我觉得是返回的格式不对,但是不知道怎么改
    gongpeione
        3
    gongpeione  
       2018-03-03 20:26:46 +08:00
    跨域了?
    bmcjxhgwy
        4
    bmcjxhgwy  
    OP
       2018-03-03 20:28:09 +08:00
    在 F12 页面上没显示有跨域的问题.....
    bmcjxhgwy
        5
    bmcjxhgwy  
    OP
       2018-03-03 20:29:56 +08:00
    我用了 jsonp 应该不会有跨域的请求..
    loading
        6
    loading  
       2018-03-03 20:30:00 +08:00 via iPhone
    返回没指定 mime ?
    或者 js 里面先 序列化一下。

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

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

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

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

    应该问题可以解决了。
    bmcjxhgwy
        25
    bmcjxhgwy  
    OP
       2018-03-03 22:42:02 +08:00
    @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  
       2018-03-03 23:06:03 +08:00 via iPhone
    @bmcjxhgwy 你直接搜索关键字 django jsonp
    g8287694
        27
    g8287694  
       2018-03-04 10:20:14 +08:00
    我记得 jsonp 的返回值是有时间戳的吧?
    zhwithsweet
        28
    zhwithsweet  
       2018-03-04 15:28:26 +08:00 via iPhone
    jsonp 技术有点老了,建议 cors
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3034 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:19 · PVG 22:19 · LAX 06:19 · JFK 09:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.