在Django中使用基于会话的cookie时遇到的问题
我正在学习《Tango With Django》这个教程,想用基于会话的 cookies 来统计用户访问网站的次数。当用户访问关于页面时,他们应该能看到一条消息,告诉他们访问网站的次数。首先,我确保在 settings.py 文件中的 INSTALLED_APPS 列表里有 django.contrib.sessions。
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.admindocs',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rango',
)
然后我运行了 'python manage.py syncdb'。我的会话在 views.py 文件中是这样处理的:
def index(request):
context_dict = {}
category_list = Category.objects.order_by('-likes')[:5]
category_list = remove_spaces(category_list)
context_dict['categories'] = category_list
page_list = Page.objects.order_by('-views')[:5]
context_dict['pages'] = page_list
# Deal with cookies
if request.session.get('last_visit'):
last_visit_time = request.session.get('last_visit')
visits = request.session.get('visits', 0)
# Use seconds instead of days for testing
if (datetime.now() - datetime.strptime(last_visit_time[:-7]), "%Y-%m-%d %H:%M:%S").seconds > 5:
request.session['visits'] = visits + 1
request.session['last_visit'] = str(datetime.now())
else:
request.session['last_visit'] = str(datetime.now())
request.session['visits'] = 1
return render(request, 'rango/index.html', context_dict)
def about(request):
if request.session.get('visits'):
count = request.session.get('visits')
else:
count = 0
context_dict = {'boldmessage': 'here is the about page','visits': count}
return render(request, 'rango/about.html', context_dict)
这是我的关于页面模板:
<!DOCTYPE html>
<html>
{% extends 'rango/base.html' %}
{% load static %}
{% block title %}About{% endblock %}
{% block body_block %}
<h1>Rango says...</h1>
<strong>{{ boldmessage }}</strong>
<h3>You have visited this site {{ visits }} times</h3>
<img src="{% static 'icon_12544.png' %}" alt="Diving helmet" />
{% endblock %}
</html>
每次我访问那个页面时,我看到的都是用户访问网站 0 次。你们觉得我哪里做错了?
1 个回答
0
你快到了。你在检查会话 cookie 是否存在时,索引视图的缩进多了一层。
def index(request):
context_dict = {}
category_list = Category.objects.order_by('-likes')[:5]
category_list = remove_spaces(category_list)
context_dict['categories'] = category_list
page_list = Page.objects.order_by('-views')[:5]
context_dict['pages'] = page_list
# Deal with cookies
if request.session.get('last_visit'):
last_visit_time = request.session.get('last_visit')
visits = request.session.get('visits', 0)
# Use seconds instead of days for testing
if (datetime.now() - datetime.strptime(last_visit_time[:-7]), "%Y-%m-%d %H:%M:%S").seconds > 5:
request.session['visits'] = visits + 1
request.session['last_visit'] = str(datetime.now())
else:
# this code was never reached, so the session was not being set
request.session['last_visit'] = str(datetime.now())
request.session['visits'] = 1
return render(request, 'rango/index.html', context_dict)