我很困惑!
我正在尝试使用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成功保存后重置它。
有没有人有更好的想法?
由于
答案 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。