django session serializer帮助选择pickle / json

时间:2014-06-06 07:34:05

标签: python django session pickle serializer

我正在使用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? 我希望我明确指出。

1 个答案:

答案 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})