在Django中使用基于会话的cookie时遇到的问题

1 投票
1 回答
702 浏览
提问于 2025-04-17 22:23

我正在学习《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)

撰写回答