我正在使用django 1.6,其中默认会话序列化程序是json。我使用db作为会话的存储引擎
我已经改变了这个设置,所以现在我使用泡菜。
现在,在阅读之后:http://www.benfrederickson.com/2014/02/12/dont-pickle-your-data.html
我对速度方面的巨大差异感到惊讶
我知道pickle的安全问题,但是现在它们不那么受关注了,因为我不会对来自用户的数据进行序列化,而且我的网站也不是那么有名。
我已经检查了我的代码,我在会话中存储的是这些类型:
字符串(对于json来说好)
布尔(对于json来说)
datetime(json不行,但我可以切换到字符串并在需要时解析它)
渲染对象(HttpRespone。不适合json)。
所以你可以看到我可以移动到json,如果我可以解决我存储的最后一种类型。
基本上就是这样:
我执行一个SQL查询来生成一些页面。此页面包含iframe(谷歌地图),需要相同的SQL输出。所以我不想两次执行相同的SQL,所以我只是使用相同的上下文和查询输出“渲染”同一视图中的两个页面,当我加载iframe时,我从会话中拉出已生成的页面。
我怎么能避免这样做?在同一视图中生成页面的解决方案是什么?
修改:
这是解释的情况
index.html包含<iframe src='/map/'>
生成index.html,视图为:
def index(request):
output = sql_query
return render_to_response('index.html', {'data':output})
由于index.html中包含iframe,因此会发送另一个GET请求,将会到达此视图:
def map(request):
# Here I need the same sql output I had from the index view.
# I don't want to perform this sql again.
# So what I did is to create the page in index view, store it in the session,
# and just return the page from the session. like this:
return request.session['rendered_page_from_index_view']
这就是我改变为pickle序列化器的原因。除此之外,我可以使用json。如何避免在会话中存储此页面,而不进行两次相同的sql? 我希望我明确指出。
答案 0 :(得分:0)
我认为您误解了会话引擎的用途,即存储和检索每个站点访问者数据以克服http的无状态特性。
如果你想节省一些sql时间,你想看一下cache framework。
修改强>
您应该从请求中找到一些可以帮助您获取唯一键的参数(可能您可以在index
中为会话设置唯一值并在map
中检索它)并使用此键设置查询集的缓存。
的伪代码:
def index(request):
queryset = get_my_queryset()
unique_id = get_unique_id_from_request(request)
request.session['queryset_id'] = unique_id
cache.set(unique_id, queryset, 30)
return render_to_response('index.html', {'data': queryset})
def map(request):
unique_id = request.session.get('queryset_id')
queryset = None
if unique_id:
queryset = cache.get(unique_id)
if queryset is None:
queryset = get_my_queryset()
return render_to_response('map.html', {'data': queryset})