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

如何用JavaScript Fetch API接收处理Django返回的JSON响应

没问题,我帮你梳理清楚怎么实现这个功能,分后端Django和前端JavaScript两部分来说:

第一步:Django后端返回指定格式的JSON响应

首先你需要在Django视图里处理请求,返回符合要求的JsonResponse。比如以邮箱是否被占用的检查为例,写一个视图函数:

# views.py
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from .models import User # 假设你有用户模型

@require_http_methods(["POST"]) # 只允许POST请求,也可以根据需求用GET
def check_email(request):
    # 兼容JSON提交和表单提交两种方式获取邮箱参数
    email = request.POST.get('email') or request.json.get('email')
    is_taken = User.objects.filter(email=email).exists()
    
    # 返回你需要的JSON结构
    if is_taken:
        return JsonResponse({
            'is_taken_email': True,
            'message': '该邮箱已经被注册了哦'
        })
    else:
        return JsonResponse({
            'is_taken_email': False,
            'message': '这个邮箱可以使用'
        })

然后记得在urls.py里配置路由,让前端能访问到这个视图:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path('check-email/', views.check_email, name='check_email'),
]
第二步:前端用Fetch API监听并处理响应

接下来写JavaScript代码,用Fetch API发起请求、接收Django返回的JSON,然后完成对比和提示操作。这里以监听邮箱输入框的失去焦点事件为例:

// 先写一个获取Django CSRF Token的工具函数(POST请求需要这个)
function getCSRFToken() {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            if (cookie.substring(0, 10) === 'csrftoken=') {
                cookieValue = decodeURIComponent(cookie.substring(10));
                break;
            }
        }
    }
    return cookieValue;
}

// 监听输入框事件,发起请求
const emailInput = document.getElementById('email-input');
emailInput.addEventListener('blur', async () => {
    const email = emailInput.value.trim();
    if (!email) return; // 空邮箱就不发起请求了

    try {
        // 发起Fetch请求
        const response = await fetch('/check-email/', {
            method: 'POST',
            headers: {
                'X-CSRFToken': getCSRFToken(),
                'Content-Type': 'application/json' // 告诉后端我们发的是JSON格式
            },
            body: JSON.stringify({ email: email }) // 把邮箱参数转成JSON字符串
        });

        // 检查请求是否成功(HTTP状态码200-299)
        if (!response.ok) {
            throw new Error(`请求出错,状态码:${response.status}`);
        }

        // 把响应转成JSON对象
        const responseData = await response.json();
        
        // 这里就是你要的「和硬编码JSON对比」的逻辑
        // 比如你硬编码预期邮箱未被占用(is_taken_email为false)
        const expectedData = { is_taken_email: false };
        if (responseData.is_taken_email === expectedData.is_taken_email) {
            alert(`符合预期:${responseData.message}`);
        } else {
            alert(`不符合预期:${responseData.message}`);
        }

        // 如果不需要对比,直接提示返回的消息也可以:
        // alert(responseData.message);

    } catch (error) {
        // 处理网络错误或者后端返回的错误
        alert(`请求失败:${error.message}`);
    }
});
一些注意事项
  • 如果你的请求是GET方式,不需要CSRF Token,参数可以直接拼在URL里,比如fetch(/check-email/?email=${encodeURIComponent(email)}),后端用request.GET.get('email')获取参数。
  • 要确保Django视图里正确处理请求数据:如果是POST+JSON格式,用request.json.get('email');如果是表单提交,用request.POST.get('email')。
  • 可以根据实际场景调整监听事件,比如按钮点击事件(给注册按钮加click监听),而不是输入框的blur事件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:03:55