【问题标题】:Deleting Session Variables Django删除会话变量 Django
【发布时间】:2016-01-16 10:26:18
【问题描述】:

所以我有一个大致结构如下的会话变量:

request.session['selected_courses'] = {
    '2': {'num_spots_available': 3, 
           attendees = [ {'first_name': 'Jon', 'last_name': 'Kan'}, ... ]}
    ...
}

“selected_courses”下的每个键都是一个课程 ID。

我需要从所选课程中删除参加者 i.e {'first_name': 'Jon', 'last_name': 'Kan'}当我尝试执行此操作时,会话实际上并没有删除与会者。当我尝试删除另一个与会者时,即使我的代码之前删除了前一个与会者,它也会立即弹回会话!但是,在重新运行此代码后,它最终将与会者从会话中删除。

views.py 中的代码(我从 POST 中提取数据,因为我正在执行 AJAX 请求并且知道数据不是由用户输入的):

course_id = str(request.POST['course_id'])
first_name = str(request.POST['first_name'])
last_name = str(request.POST['last_name'])
request.session['selected_courses'][str(course_id)]['attendees'] = [a for a in request.session['selected_courses'][str(course_id)]['attendees']
        if a['first_name'] != first_name or a['last_name'] != last_name]

request.session.modified =True

所以我尝试了 request.session.modified 属性(如上所示)以及SESSION_SAVE_EVERY_REQUEST = True,但都没有成功。 (请注意:我对 Django 还是很陌生)。

【问题讨论】:

    标签: python django session request


    【解决方案1】:

    这段代码太复杂了,至少有一个严重的错误。 remove 不会返回修改后的列表,而是返回None,所以如果你返回attendees = attendees.remove(...),那么参加者现在将是 None。

    编写此代码的一种非常简单的方法是使用循环:

    for course in request.session['selected_courses']:
        if course['course_id'] == course_id:
            course['attendees'] = [
                a for a in course['attendees']
                if a['first_name'] != first_name and a['last_name'] != last_name
            ]
            break
    

    请注意,这并没有降低效率,因为您对 mapremove 的调用本身就是循环。

    或者,您可以考虑使用不同的数据结构;如果您经常需要在 selected_courses 中搜索特定课程 ID,最好将其存储为由该 ID 键入的字典,而不是包含该 ID 作为值的字典列表。

    request.session['selected_courses'] = {
       '2': [ {'first_name': 'Jon', 'last_name': 'Kan'}, ... ]
    }
    

    【讨论】:

    • 感谢丹尼尔的回答!是的,所以我尝试了您的解决方案,但是它仍然没有删除与会者。我将尝试更改我的会话数据结构,如果仍然无法正常工作,请告知您。
    猜你喜欢
    • 1970-01-01
    • 2014-09-13
    • 2012-05-14
    • 2015-07-09
    • 2013-07-14
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多