Django中Ajax触发500内部服务器错误的原因排查求助
Ajax调用出现500内部服务器错误排查
调用Ajax函数时一直出现500内部服务器错误,有人知道原因吗?我试过两种方式从view.py给Ajax返回响应:POST分支用HttpResponse,GET分支用JsonResponse。HTML表单里已经加了csrf_token,Ajax请求头也带了对应的CSRF令牌,还是报500。数据能成功存到数据库,但响应就是传不到Ajax那边。
View.py代码
## Ajax @login_required def SubmitModal(request): if request.method == 'POST': text = request.POST['Text'] date = request.POST['DatePicker'] time = request.POST['TimePicker'] T = SText() T.User = request.user T.Text = text T.STime = date + ' ' + time T.save() return HttpResponse(json.dumps({'success': True}), content_type="application/json") else: return JsonResponse({'success': False})
前端Ajax代码
$(document).ready(function () { // Show the modal window when a button is clicked $('#open-modal').click(function () { $('#modal').modal('show'); }); // Close the modal window when a button is clicked $('.close-modal').click(function () { $('#modal').modal('hide'); }); // Handle the form submission $('#modal-form').submit(function (event) { event.preventDefault(); // Prevent the form from being submitted var formData = $(this).serialize(); // Get the form data // Submit the form data to the server using an AJAX request $.ajax({ type: 'POST', url: '/submit/', headers: {'X-CSRFToken': '{{ csrf_token }}'}, data: formData, dataType: "json", success: function (response) { if (response.success) { $('#success-message').show(); } else { $('#error-message').show(); } }, error: function (xhr, status, error) { console.log(error); } }); $(".textarea-input")[0].value = ''; $(".date-input")[0].value = ''; $(".time-input")[0].value = ''; }); });
可能的问题及解决办法
未导入json模块
POST分支里用了json.dumps但未导入模块,会触发NameError导致500。在view.py顶部添加:import jsonSTime字段格式不规范
直接拼接date和time字符串赋值给DateTimeField可能存在格式隐患,建议用datetime模块解析:from datetime import datetime # 替换原拼接行,需根据实际输入格式调整格式化字符串 T.STime = datetime.strptime(f"{date} {time}", "%Y-%m-%d %H:%M")CSRF令牌渲染失效
如果JS是独立文件,{{ csrf_token }}不会被模板渲染。改为通过meta标签获取:
页面添加meta标签:<meta name="csrf-token" content="{{ csrf_token }}">JS里修改请求头:
headers: {'X-CSRFToken': $('meta[name="csrf-token"]').attr('content')},统一返回格式
改用JsonResponse统一处理返回,避免手动序列化出错:# 替换POST分支的返回语句 return JsonResponse({'success': True})
内容的提问来源于stack exchange,提问作者Paul Viorel
相关产品推荐
相关产品推荐

