You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Django学习Ajax时遇JSON语法错误,求代码问题排查方向

排查Django Ajax中SyntaxError: Unexpected token < in JSON at position 1错误

这个错误我之前帮好几个开发者排查过,本质是你的前端Ajax请求拿到的不是合法的JSON数据,而是HTML内容——通常是后端返回了错误页面(比如403、404、500)或者压根没返回JSON。结合你的代码和场景,大概率是下面这些问题:

  • 后端视图没有返回合法JSON
    很多新手容易犯的错:视图里用render()返回了HTML页面,而不是用JsonResponse()返回JSON数据。比如如果你的视图处理逻辑出错,或者直接返回了模板页面,前端拿到HTML后,JSON解析器碰到开头的<就会报错。
    正确的做法是在视图里处理完逻辑后,用JsonResponse返回数据:

    from django.http import JsonResponse
    
    def translate_view(request):
        if request.method == 'POST':
            # 处理你的逻辑,比如获取表单数据、翻译操作
            data = {'result': '翻译后的内容'}
            return JsonResponse(data)
        # 非POST请求可以返回错误或者空数据
        return JsonResponse({'error': 'Invalid request'}, status=400)
    
  • CSRF令牌处理仍有问题
    你提到修改了csrf_token但没解决,可能是Ajax请求里没正确携带令牌。虽然表单里有{% csrf_token %},但Ajax请求不会自动带上这个令牌,需要手动处理:
    比如用jQuery发送Ajax的话,可以这么做:

    // 获取页面中的csrf令牌
    var csrfToken = $('input[name="csrfmiddlewaretoken"]').val();
    // 发送Ajax请求
    $.ajax({
        url: 'translate/',
        type: 'POST',
        data: {
            'string': $('#email').val(),
            'csrfmiddlewaretoken': csrfToken
        },
        dataType: 'json',
        success: function(response) {
            // 处理返回的JSON
            console.log(response);
        }
    });
    

    或者你也可以通过设置请求头X-CSRFToken来传递令牌,需要先从cookie里获取csrf值(Django默认会把csrf令牌存在cookie里)。

  • 请求路径不匹配,后端返回404页面
    你的表单action是translate/,要确保这个URL在urls.py里正确映射到了处理翻译的视图函数。如果URL配置错误,后端会返回404的HTML页面,前端解析JSON自然会出错。
    检查urls.py里的配置,比如:

    from django.urls import path
    from . import views
    
    urlpatterns = [
        # 确保这里的路径和你的action对应
        path('translate/', views.translate_view, name='translate'),
    ]
    
  • 没有阻止表单的默认提交行为
    如果你的Ajax代码是绑定在表单的submit事件上,但没阻止表单的默认提交行为,那么表单会按照传统方式刷新页面,Ajax请求可能没正确发送,或者前端拿到的是页面跳转后的HTML内容。
    解决方法是在提交事件里调用event.preventDefault():

    $('form').submit(function(event) {
        // 阻止表单默认提交
        event.preventDefault();
        // 然后执行你的Ajax逻辑
        // ...
    });
    
  • 后端视图抛出异常,返回错误页面
    比如视图里的处理逻辑出错(比如翻译函数报错、数据库连接问题),Django会返回500错误的HTML页面,前端拿到后也会触发这个JSON解析错误。你可以查看后端的控制台日志,看看有没有具体的报错信息,或者在浏览器开发者工具的Network标签里查看请求的响应内容,就能知道返回的是哪个错误页面。

调试小技巧

打开浏览器的开发者工具(按F12),切换到Network标签,找到你的Ajax请求,查看Response内容——这里显示的就是后端返回的实际内容,能直接帮你定位是403、404还是500错误,或者是返回了错误的HTML。

内容的提问来源于stack exchange,提问作者Prateek Oraon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:56:47