删除会话变量Django

时间:2016-01-15 13:40:00

标签: python django session request

所以我有一个像这样粗略结构的会话变量:

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的新手。)

1 个答案:

答案 0 :(得分:2)

这段代码太复杂了,至少有一个严重的错误。 remove不会返回修改后的列表,而是None,因此,如果您执行attendees = attendees.remove(...),则与会者现在将为“无”。

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

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'}, ... ]
}