0

我很困惑!

我正在尝试使用 Django 的缓存系统来存储一些数据,以便在用户与页面交互时可以在主视图的 GET/PUT 以及几个潜在的 AJAX 视图中访问它。

我认为我需要一个唯一的密钥来存储这些数据,以便用户可以同时处理多个实例(例如,如果他们在多个选项卡中打开了页面)。

我认为 session_key 可以用于此。但是,当使用基于缓存的会话时,此键似乎对所有实例都是相同的。

这是一些代码:

def my_view(request):
  my_session_id = request.session.session_key
  my_complex_thing_key = u"my_complex_thing_%s" % my_session_id
  my_complex_thing = cache.get(my_complex_thing_key)
  if not my_complex_thing:
    my_complex_thing = my_complex_function()  # this is very expensive, I want to avoid having to do it repeatedly in AJAX calls
    cache.set(my_complex_thing_key, my_complex_thing)
  if request.method == "GET":
    my_form = MyFormFactory(my_complex_thing)
  elif request.method == "POST":
    my_form = MyFormFactory(request.POST, my_complex_thing)
    if my_form.is_valid():
      my_form.save()
  return render_to_response('my_template.html', {"form": my_form}, context_instance=RequestContext(request))

问题是my_complex_thing_key每次同一个用户运行这个视图时都是一样的。我希望每次用户发出新的 GET 请求时它都会改变。

在我的脑海中,我想我可以在 GET 中生成一个 guid,然后跟踪它(通过将它作为参数传递给模板?)并且只有在 POST 中成功保存后才重置它。

有没有人有更好的想法?

谢谢

4

1 回答 1

0

回答我自己的问题...

def get_key_from_request(request):
  if not request.is_ajax():
    if request.method == "GET":
        # a normal GET resets the key
        key = str(uuid4())
    else:
        # a normal POST should have the key in the datadict
        key = request.POST["key"]
  else:
    if request.method == "GET":
        # an AJAX GET should have passed the key as a parameter
        key = request.GET["key"]
    else:
        # an AJAX POST should have the key in the datadict
        key = request.POST["key"]
  return key

然后在视图中:

def my_view(request):
  my_complex_thing_key = u"my_complex_thing_%s" % get_key_from_request(request)
  my_complex_thing = cache.get(my_complex_thing_key)
  if not my_complex_thing:
    my_complex_thing = my_complex_function()
    cache.set(my_complex_thing_key, my_complex_thing)
  if request.method == "GET":
    my_form = MyFormFactory(my_complex_thing)
  elif request.method == "POST":
    my_form = MyFormFactory(request.POST, my_complex_thing)
    if my_form.is_valid():
      my_form.save()
  return render_to_response('my_template.html', {"form": my_form, "key": my_complex_thing_key}, context_instance=RequestContext(request))

然后在模板中:

<form method="POST" action="">
  <input class="hidden" type="text" id="_key" name="key" value="{{ key }}"/>
  ...
</form>

现在该输入将在主视图的 request.POST 中可用,我可以根据需要将其添加到 AJAX GET/POST。

于 2015-03-05T23:37:16.080 回答