Django的views.py中如何实现登录视图同时返回Ajax响应与按用户类型重定向
登录Ajax请求同时返回响应并跳转的实现方案
核心问题说明
HTTP协议为单次请求对应单次响应的模式,后端无法对同一个请求先后返回JSON响应和重定向响应,你当前代码中走到redirect逻辑时会直接返回302重定向响应,后续的JSON响应代码永远不会执行,跳转逻辑必须交给前端触发。
实现步骤
1. 修改后端视图逻辑
移除后端直接返回重定向的代码,将用户对应的跳转地址存入JSON响应字段返回给前端,修改后代码如下:
@csrf_exempt def login_view(request): next = request.GET.get('next') email = request.POST.get("email") password = request.POST.get("password") user = authenticate(username=email, password=password) if user is not None and user.is_active: login(request,user) # 先确定对应跳转地址 if user.is_male: target_url = '/male_profile' elif user.is_female: target_url = '/female_profile' elif user.is_other: target_url = '/other_profile' else: target_url = next or '/' # 兜底跳转逻辑 # 把跳转地址放入响应数据 data_json = { "error" : False, "errorMessage" : "Login Successful!", "redirect_url": target_url } return JsonResponse(data_json, safe=False) else: data_json={"error":True,"errorMessage":"Username or password is incorrect!"} return JsonResponse(data_json,safe=False)
2. 修改前端Ajax回调逻辑
前端收到登录成功的响应后,读取返回的跳转地址字段,主动触发页面跳转,示例代码如下(以jQuery Ajax为例):
// 登录请求示例 $.ajax({ url: "/login/", type: "POST", data: { email: $("#email").val(), password: $("#password").val(), csrfmiddlewaretoken: "{{ csrf_token }}" // 若开启CSRF校验需携带该字段 }, success: function(res) { if (!res.error) { // 可在此处先执行登录成功提示等逻辑 alert(res.errorMessage); // 触发页面跳转 window.location.href = res.redirect_url; } else { // 登录失败展示错误信息 alert(res.errorMessage); } } })
修改后即可同时满足「获取Ajax响应」和「按用户类型跳转」的需求,流程为:前端发起登录请求→后端校验通过返回带跳转地址的JSON响应→前端接收响应后先处理自定义逻辑(如提示登录成功),再执行跳转。
内容的提问来源于stack exchange,提问作者sodmzs1
相关产品推荐
相关产品推荐

