Django 会话持久但丢失数据

发布于 2024-08-15 20:40:10 字数 1698 浏览 10 评论 0原文

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

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

第一次点击:

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

第二次点击:

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

第三次请求:

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

非常感谢大家!

注意:这是上一个问题的后续问题关于相同的源代码。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

人海汹涌 2024-08-22 20:40:10

我认为我不完全理解这个问题,但您可能想看看会话引擎

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

另一种可能性是您的会话没有被保存,因为您没有更改会话,而是更改了存储在会话中的可变对象。您可以尝试强制保存会话 通过将其添加到您视图中的某个位置:

request.session.modified = True

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文