每个视图使用Django会话而不是每个用户

时间:2015-03-05 21:33:35

标签: django session caching django-sessions django-cache

我很困惑!

我正在尝试使用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成功保存后重置它。

有没有人有更好的想法?

由于

1 个答案:

答案 0 :(得分: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。