【问题标题】:Django sessions: can you check for session data and set it in same view?Django 会话:您可以检查会话数据并将其设置在同一视图中吗?
【发布时间】:2011-06-25 04:37:36
【问题描述】:

在使用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,这不会为他查看的每个页面在数据库中创建一个新的会话条目吗?对吧?

【问题讨论】:

    标签: python django django-sessions


    【解决方案1】:

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

    【讨论】:

    • 太好了,感谢您的建议。我想我应该实现一些非常相似的东西:)
    【解决方案2】:

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

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

    if game_name in game_votes:
    

    【讨论】:

    • 感谢您的提示,我应该知道比使用 has_key 更好。
    • 我对我的代码的主要关注是:如果用户禁用了 cookie,我的代码会为他们访问的每个页面添加一个新会话到数据库吗?因为它无法判断它们是否被设置?
    猜你喜欢
    • 2011-07-05
    • 2010-10-11
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多