Сессия Django постоянна, но теряет данные - PullRequest
6 голосов
/ 22 декабря 2009

Я часами работаю, пытаясь понять следующую проблему: у меня есть пользователь, отправляющий Ajax-запрос на динамическую отправку формы и запись о том, что количество форм для чтения при отправке увеличилось. Для этого я использую request.session['editing_foo'] = { 'prefix_of_form_elements' : pkey }, чтобы связать их с базой данных для сохранения и загрузки (-1 для новых форм, которые еще не были сохранены).

Однако, когда я использую следующий код (см. Внизу), я получаю следующий причудливый вывод:

1-й клик:

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

2-й клик:

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

3-й запрос:

{} foousername
next_key 1
1
{u'1-foo': -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))

Спасибо всем большое!

Примечание. Это продолжение предыдущего вопроса относительно того же исходного кода.

1 Ответ

12 голосов
/ 22 декабря 2009

Я не думаю, что полностью понимаю вопрос, но вы можете взглянуть на то, какой механизм сессии вы используете

если вы используете механизм кеширования сессии, вам необходимо убедиться, что вы правильно настроили кеширование (например, фиктивный кеш просто выбросил бы данные вашего сеанса)

другая возможность - ваш сеанс не сохраняется, потому что вы не меняете сеанс, вы меняете изменяемый объект, который хранится в сеансе. вы можете попробовать заставить сеанс сохранить , добавив это где-то в вашем представлении:

request.session.modified = True
...