Django 如何从Python函数向JavaScript传值:调用时出现500内部服务器错误排查
问题原因
- 核心触发报错的根源是Django视图的返回值不符合规范:Django函数视图必须返回HttpResponse(或其子类)的实例,不能直接返回裸字符串。你在代码中直接
return "Okay, we'll see.",当Django拿到这个字符串类型的返回值后,会在后续请求处理流程(比如响应头处理、内置中间件逻辑)中尝试按照HttpResponse的接口调用方法(比如读取响应头的get逻辑),而字符串对象不存在get方法,因此触发'str' object has no attribute 'get'错误,前端AJAX调用时自然会收到500内部服务错误。 - 你的视图中
userText = request.GET.get('msg')这行逻辑没有问题,就算直接访问路径不带msg参数,QueryDict的get方法也只会返回None,不会引发报错。 - 附带的前端逻辑缺陷:当前JS代码中
appendMessage("", "msgText");错误地把字面量字符串"msgText"作为参数传入,没有引用之前从接口拿到的msgText变量,就算后端修复后,前端也无法正确渲染返回内容。
落地修复方案
- 修正views.py的视图返回逻辑
首先导入对应响应类,替换原来直接返回字符串的写法:- 如果需要返回纯文本给前端,导入HttpResponse即可:
# 新增HttpResponse导入 from django.http import HttpResponse def get_bot_response(request): userText = request.GET.get('msg') # 可补充对userText的业务处理逻辑 # 返回标准HttpResponse对象,传入要输出的文本内容 return HttpResponse("Okay, we'll see.")- 更适配AJAX接口的写法是使用JsonResponse返回结构化数据,避免不同浏览器对响应类型的兼容问题:
from django.http import JsonResponse def get_bot_response(request): userText = request.GET.get('msg') return JsonResponse({ "reply": "Okay, we'll see." }) - 修正JS中的参数传递问题
去掉msgText外层的双引号,把变量本身传入appendMessage方法,避免把字面量当参数传入:function botResponse(rawText) { $.get("/get", { msg: rawText }).done(function (data) { // 纯文本响应直接取data即可 const msgText = data; // 如果使用JsonResponse返回的结构化数据,将取值替换为 data.reply 即可 appendMessage("", msgText); }); } - 验证步骤
修复完成后,先直接在浏览器访问http://127.0.0.1:8000/get/,确认能正常看到返回内容、无报错提示后,再触发前端的AJAX调用流程即可。
内容的提问来源于stack exchange,提问作者Cool Man
相关产品推荐
相关产品推荐

