使用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,这不会为他查看的每个页面在数据库中创建一个新的会话条目?正确?
答案 0 :(得分:4)
这是完全正确的。会话数据不存储在cookie中 - cookie只是将用户数据的唯一ID存储在会话数据库中。
一个小问题:不要使用has_key
- 多年来一直不鼓励在Python中使用它。使用in
:
if game_name in game_votes:
答案 1 :(得分:1)
在单个视图中检查会话然后在同一视图中设置变量是完全正常的 - 大多数时候,如果我在几个不同的视图中需要这些数据我会做一个私有函数(在名称前面只有一个下划线)并调用它并将请求参数传递给函数,因此它可以访问会话数据。然后在需要访问会话数据的每个视图中,我确保在开始时调用此函数,以便数据始终可用。