我首先通过 POST 请求将一个 JS 变量"确认"传递给我的 Django 视图。 然后我运行一个python脚本,它接受这个变量并进行一些处理。 最后,我想将其传递回我的html/JS,以便我可以显示处理后的数据。
我目前正在尝试使用 Django 会话来实现我的目标,但存在"1 个会话延迟",因此我更新的会话变量作为上一个会话的值返回。
有没有更好的方法可以将变量从我的视图传递到当前解决方案的 JS/a 修复程序?
视图:
def crossword(request):
if request.method == 'POST':
Session.objects.all().delete()
str_squares = (request.body).decode('utf-8')
squares = [int(i) for i in str_squares.split(',')]
letters = puzzle_solver.solve_puzzle(3, squares)
# print(letters)
for each_square in letters.keys():
request.session[each_square] = letters[each_square]
request.session.modified = True
return render(request, 'crossword.html')
.JS:
// Output a list of active squares
var xhr = new XMLHttpRequest();
var generate = { Generate:function(){
var confirmed = [];
for (i=0; i<active_boxes.length; i++){
confirmed.push(active_boxes[ i ].id_num);
}
console.log(confirmed);
xhr.open("POST", "http://localhost:8000/", true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(c=confirmed);
console.log("{{ request.session.keys }}")
console.log("{{ request.session.values }}")
var tester = parse_session_keys("{{ request.session.keys }}");
console.log(tester);
solve_crossword(tester);
}};
有什么原因不直接将响应发送回 JS?在你的views.py
,你可以做
from django.http import JsonResponse
def crossword(request):
if request.method == 'POST':
str_squares = (request.body).decode('utf-8')
squares = [int(i) for i in str_squares.split(',')]
letters = puzzle_solver.solve_puzzle(3, squares)
return JsonResponse(letters)
return render(request, 'crossword.html')
发送请求后,等待并直接将响应读取为 JSON,然后在 JS 代码中使用它,如本文所述。
如果有任何原因阻止您这样做(例如,可能有一个表单也向同一页面发出 POST 请求,因此您最终需要登陆呈现填字游戏模板(,请为您的 api 分配另一个 url,例如/api/crossword
您最初使用会话的想法不应在此用例中使用,尤其是在Session.objects.all().delete()
行中(不要在未检查的情况下删除所有会话数据(。