我有几个捕获ajax请求的函数。我从请求中获取数据并将其放入数组。然后,我通过另一个函数遍历此数组,以将数据传递到上下文。该解决方案基本上可以正常工作,但这是一种好的处理方式吗?感谢任何反馈。
一段代码:
user_choices = []
@login_required
@csrf_exempt
def make_order(request):
if request.method == "POST" and request.is_ajax():
data = json.loads(request.body)
for order in data["array"]:
user_choices.append(order)
return HttpResponse(200)
else:
return redirect(request, 'home')
movie = 0
seats = []
@login_required
def confirmation(request):
if len(user_choices) > 0:
movie = Movies.objects.get(pk=int(user_choices[0]["id"]))
for seat in user_choices:
seats.append(seat["row"]+":"+seat["seat"])
context = {
"movie":movie.title,
"seats":seats
}
return render(request, "main_templates/confirmation.html", context)
else:
return redirect("home")
答案 0 :(得分:3)
我有几个捕获ajax请求的函数。我从请求中获取数据并将其放入数组。然后,我通过另一个函数遍历此数组,以将数据传递到上下文。该解决方案基本上可以正常工作,但这是一种很好的处理方式吗?
否,您引入了一个称为global state [se]的反模式。全局状态是一种严重的反模式,因为它会使程序不可预测。根据先前的请求,该列表可能已经包含数据。通常,GET请求应具有 no 副作用。通过更改列表,情况已不再如此。
此外,在这种特定情况下,这意味着如果一个用户查询数据,然后另一个用户请求数据,则第一个用户的数据“泄漏”给第二个用户。
但是,即使您设法使其变得更加安全,全局状态也会带来很多困难。这些在software engineering post中进行了讨论。虽然您当然可以每次都以手动解决这些问题为目标,但这会导致大量的工作和错误,因此,麻烦多于其应有的价值。