Django会话:您可以检查会话数据并将其设置在同一视图中吗?

时间:2011-02-10 21:52:58

标签: python django django-sessions

使用Django sessions时,在同一视图中查看会话数据是否已预先设置,是否设置初始会话数据是不错的做法?

如果用户禁用了Cookie,这会对我或用户造成重大问题吗?

test cookies的存在让我感到困惑。但是如果您使用这些,您将无法记录用户最初查看的页面的数据。)


以下是我的views.py文件的摘录。在视图中,用户正在访问带有游戏的页面。

如果他们之前存储了会话数据 - 并且如果第一次查看游戏 - 该视图将修改会话数据以记录他们访问过游戏的事实。如果他们没有会话数据,那么将在这里为他们初始化。

def game(request, game_name):
    game = get_object_or_404(Game, web_name=game_name)
    c = { 'game': game }

    # game_votes is used to store if user has voted on game yet.
    # Also a key in dictionary indicates user has previously visited that game.
    game_votes = request.session.get('game_votes', False):
    if game_votes:
        if not game_votes.has_key(game_name):
            game_votes[game_name] = False
            request.session['game_votes'] = game_votes
            request.session.modified = True
        else:
            pass
    else: # I.e. no session was declared previously.
        request.session['game_votes'] = { game_name: False }
        request.session['sorting_choice'] = 'PO'
        request.session['ip_address'] = request.META['HTTP_X_FORWARDED_FOR']

    return render_to_response('game.html', c)


由于这是我第一次使用Django,我想知道我在使用会话时无意中犯了哪些明显的错误。

非常感谢您的专业知识和帮助:)


编辑:

所以只是检查一下:如果用户禁用了cookie,这不会为他查看的每个页面在数据库中创建一个新的会话条目?正确?

2 个答案:

答案 0 :(得分:4)

这是完全正确的。会话数据不存储在cookie中 - cookie只是将用户数据的唯一ID存储在会话数据库中。

一个小问题:不要使用has_key - 多年来一直不鼓励在Python中使用它。使用in

if game_name in game_votes:

答案 1 :(得分:1)

在单个视图中检查会话然后在同一视图中设置变量是完全正常的 - 大多数时候,如果我在几个不同的视图中需要这些数据我会做一个私有函数(在名称前面只有一个下划线)并调用它并将请求参数传递给函数,因此它可以访问会话数据。然后在需要访问会话数据的每个视图中,我确保在开始时调用此函数,以便数据始终可用。