Django的views.py中如何根据用户输入更新变量实现多轮交互
Django实现多轮对话交互的调整方案
核心问题原因
- Python函数执行到
return语句后会直接终止,你写在第一个HttpResponse后面的所有代码永远不会被执行。 input()是本地控制台交互函数,运行在服务端时只会等待服务端本地控制台输入,无法把输入请求传递到用户浏览器,完全不符合Web交互场景。- HTTP协议是无状态的,每次前端发送的AJAX请求都是独立的,后端不会自动记忆上一次对话的进度,需要主动存储会话状态。
- 你调用
HttpResponse时用逗号分隔多个内容的写法错误,HttpResponse仅接收第一个位置参数作为返回的响应内容,多内容拼接需要用字符串格式化语法。
代码调整方案
后端views.py调整
我们用Django自带的session功能存储对话进度和已收集的用户信息,按对话步骤分支处理逻辑:
import datetime from django.http import HttpResponse def getResponse(request): # 初始化会话状态:step标识对话进度,0为初始状态,1等待用户输入姓名,2等待用户输入出生年份 if 'chat_step' not in request.session: request.session['chat_step'] = 0 request.session['user_name'] = '' user_message = request.GET.get('userMessage', '').strip() current_step = request.session['chat_step'] if current_step == 0: # 首次对话返回开场问题,进入待输入姓名阶段 request.session['chat_step'] = 1 return HttpResponse("Good to see you. May I know your name?") elif current_step == 1: # 接收用户输入的姓名,进入待输入出生年份阶段 request.session['user_name'] = user_message request.session['chat_step'] = 2 return HttpResponse(f"Good to know you {user_message}. I can tell you your age if you tell me which year you were born") elif current_step == 2: # 接收出生年份计算年龄,结束后重置会话状态 try: birth_year = int(user_message) age = datetime.date.today().year - birth_year # 重置状态,支持用户开启新一轮对话 del request.session['chat_step'] del request.session['user_name'] return HttpResponse(f"You are {age} years old") except ValueError: # 输入非法年份时提示重试,不进入下一个步骤 return HttpResponse("Please enter a valid 4-digit birth year")
前端代码说明
你现有的AJAX交互逻辑无需修改,即可正常支持多轮对话效果,原有逻辑已经实现了输入发送、内容追加的功能,可直接运行。
额外注意事项
- 确保Django配置中开启了session功能:默认状态下
INSTALLED_APPS包含django.contrib.sessions、MIDDLEWARE包含django.contrib.sessions.middleware.SessionMiddleware即可正常使用session。 - 如果需要支持用户刷新页面后继续未完成的对话,不要在前端清除站点Cookie即可。
内容的提问来源于stack exchange,提问作者Tompson
相关产品推荐
相关产品推荐

