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

0 投票
2 回答
3298 浏览
提问于 2025-04-16 11:36

在使用 Django 的会话 时,检查会话数据是否已经设置过,如果没有就设置初始会话数据,这样做在同一个视图里算不算好习惯呢?

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

(关于 测试 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,我想知道在使用会话时我有没有犯什么明显的错误。

非常感谢你的专业意见和帮助 :)


编辑:

所以我想确认一下:如果用户禁用了 cookies,这不会为他们查看的每个页面在数据库中创建一个新的会话条目,对吧?

2 个回答

1

在一个视图里检查会话数据,然后在同一个视图里设置变量是完全可以的。大多数情况下,如果我需要在几个不同的视图中使用这些数据,我会创建一个私有函数(名字前面加个下划线),然后调用这个函数,并把请求参数也传给它,这样它就能访问会话数据了。然后在每个需要访问会话数据的视图里,我会确保在开始时调用这个函数,这样数据就总是可以用。

4

这说得完全正确。会话数据并不是存储在 cookies 里,cookie 只是用来存放用户在会话数据库中数据的唯一标识符。

有一点小建议:不要使用 has_key,因为在 Python 中已经不推荐使用这个方法很多年了。可以用 in 来代替:

if game_name in game_votes:

撰写回答