Django Session Persistent but Losing Data

2019-04-28 13:15发布

问题:

I have been working for hours trying to understand the following problem: I have a user send an Ajax request to dynamically send a form and record that the number of forms to read on submission has increased. Toward this end I use request.session['editing_foo'] = { 'prefix_of_form_elements' : pkey } so that I can associate them with the database for saving and loading (-1 is for new forms that haven't been saved yet).

However, when I use the following code (see bottom) I get the following bizarre output:

1st Click:

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

2nd Click:

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

3rd Request:

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

What the heck is going on?

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))

Thank you all very much!

Note: This is a followup to a previous question concerning the same source code.

回答1:

I don't think I completely understand the question, but you may want to take a look at which session engine you're using

if you're using the cache session engine you need to make sure you have caching properly set up (for instance the dummy cache would just throw out your session data)

another possibility is that your session isn't being saved because you're not changing the session, you're changing a mutable object that is stored in the session. you can try forcing the session to save by adding this somewhere in your view:

request.session.modified = True