代码之家  ›  专栏  ›  技术社区  ›  SapphireSun

Django会话持续,但数据丢失

  •  6
  • SapphireSun  · 技术社区  · 15 年前

    我已经花了几个小时的时间试图理解以下问题:我让一个用户发送一个Ajax请求来动态发送一个表单,并记录在提交时要读取的表单数量增加了。为了这个目的我用 request.session['editing_foo'] = { 'prefix_of_form_elements' : pkey } 以便将它们与数据库关联以进行保存和加载(-1用于尚未保存的新表单)。

    但是,当我使用下面的代码(参见底部)时,会得到以下奇怪的输出:

    第一点击:

    {} foousername
    next_key 1
    1
    {u'1-foo': -1}
    

    第二点击:

    {} FooServer名称
    NEXT键1
    一
    {u’1-fo’:- 1 }
    

    第三请求:

    {} FooServer名称
    NEXT键1
    一
    {u’1-fo’:- 1 }
    

    怎么回事?

    id_fetcher = re.compile(r'\d')
    
    
    @login_required
    def ajax_add_foo(request):
        def id_from_prefix(key):
            return int( id_fetcher.search(key).group(0) )
    
        if 'editing_foos' not in request.session:
            print "reinitializing"
            request.session['editing_foos'] = {}
    
        print request.session['editing_foos'], request.user
        keys = request.session['editing_foos'].keys()
        if len(keys) == 0:
            next_key = 1
        else:
            print [ id_from_prefix(key) for key in keys ]
            next_key = max([ id_from_prefix(key) for key in keys ]) + 1
        print "next_key", next_key
    
        fooform = FooForm(prefix=next_key)
        print next_key
    
        request.session['editing_foos'].update( {create_prefix(FooForm, next_key) : -1 } ) # This quote is new and has no pkey
        print request.session['editing_foos']
    
        return render_to_response( 'bar/foo_fragment.html',
                                    {'fooform' : fooform, },
                                    context_instance=RequestContext(request))
    

    非常感谢大家!

    注意:这是对 previous question 关于同一源代码。

    1 回复  |  直到 15 年前
        1
  •  12
  •   Jiaaro    15 年前

    我不认为我完全理解这个问题,但你可能想看看 session engine 你在用

    如果您使用的是缓存会话引擎,则需要确保正确设置了缓存(例如,虚拟缓存只会抛出会话数据)。

    另一种可能是会话没有被保存,因为您没有更改会话,而是更改了存储在会话中的可变对象。你可以试试 forcing the session to save 通过在视图中的某个位置添加:

    request.session.modified = True