Django中Cookie与Session的原理及实战应用

Felix
Felix
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Django中Cookie和Session的工作机制。针对HTTP协议的无状态特性,介绍如何通过客户端Cookie和服务器端Session实现状态保持。详细讲解Cookie的键值对存储、域名安全及过期时间设置,以及Session在服务器端的存储方式、与Cookie的依赖关系和生命周期管理。结合Django代码示例,演示如何设置、获取、清除Cookie和Session,并对比两者的适用场景,帮助开发者构建更安全、高效的Web应用。

HTTP无状态特性与状态保持概述

HTTP协议本身是无状态的,这意味着服务器无法自动识别后续请求是否来自之前的访问者,也无法记忆用户在上一次交互中的具体行为。

从应用层面来看,造成这种无状态现象的原因是浏览器与服务器之间的所有通信均严格遵循HTTP协议规范。

从底层网络通信角度分析,根本原因在于浏览器与服务器通过Socket套接字进行交互。当服务器将处理结果返回给浏览器后,会立即关闭当前的Socket连接,同时服务器在处理完页面逻辑后也会销毁对应的页面对象。

在实际开发中,往往需要保存用户的浏览状态,例如判断用户是否已登录、浏览过哪些商品等。实现这种状态保持主要有两种技术手段:

一种是在客户端存储信息,使用Cookie;另一种是在服务器端存储信息,使用Session。

Cookie是由服务器生成并存储在浏览器端的一小段文本数据。

Cookie具有以下几个显著特点:

  • 1) 数据以键值对的形式进行存储。
  • 2) 当用户通过浏览器访问某个网站时,浏览器会自动将该网站相关的、存储在本地所有Cookie信息发送给服务器。可通过request.COOKIES对象访问这些数据。
  • 3) Cookie遵循域名安全原则,即www.baidu.com生成的Cookie只能被www.baidu.com访问,而不会被www.tudou.com获取。
  • 4) Cookie设有过期时间,若未明确指定,默认在用户关闭浏览器后Cookie即告失效。

接下来通过具体示例展示Cookie的使用方法。

Django中Cookie的设置与获取

首先介绍如何设置Cookie。


def set_cookie(request):
  """设置cookie信息"""
  response = HttpResponse("设置cookie")
  # 设置一个cookie信息,名字为num,值为1
  response.set_cookie('num', 1)  
  # 返回response
  return response

接着演示如何从请求中获取已设置的Cookie信息。


def get_cookie(request):
  """获取cookie信息"""
  # 取出cookie num的值
  num = request.COOKIES['num']
  return HttpResponse(num)

然后讲解如何为Cookie设置特定的过期时间。


def set_cookie(request):
  """摄制cookie信息"""
  response = HttpResponse("设置cookie")
  # 设置一个cookie信息,名字为num,值为1,并且设置 cookie的过期时间为2周,两种方式
  response.set_cookie('num', 1, max_age=14*24*3600)
  # response.set_cookie('num', 1, expires=datetime.now()+timedelta(days=14))
  return response

最后展示如何在同一个响应中设置多个不同的Cookie。


def set_cookie(request):
  """摄制cookie信息"""
  response = HttpResponse("设置cookie")
   # 设置多个cookie
  response.set_cookie('num', 1)
  response.set_cookie('num2', 2)
  return response

Cookie实战:记住用户名功能实现

下面通过一个“记住用户名”的完整示例来串联上述操作。

首先需要编写前端登录页面login.html。


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Login</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form action="/login_check/" method="post">
  <label for="username">用户:
    <input type="text" id="username" name="username" value="{{ usernam }}">
  </label>
  <br />
  <label for="password">密码:
    <input type="password" id="password" name="password">
  </label>
  <br />
  <input type="checkbox" name="remember">记住用户名
  <br />
  <input type="submit" value="登录">
</form>

</body>
</html>

随后实现后端校验逻辑login_check函数。


def login_check(request):
  # 1.获取用户名和密码
  username = request.POST.get("username")
  password = request.POST.get("password")
  remember = request.POST.get("remember")
  print(username, password)
  # 2.进行校验
  # 3.返回应答
  if username == "yifchan" and password == "yifchan":
    response = redirect("/index")
    # 判断是否需要记住用户名
    if remember == 'on':
      # 设置cookie username-过期时间为1周
      response.set_cookie('username', username, max_age=7*24*3600)
    return response
  else:
    return HttpResponse("账号或密码错误")

接着编写处理登录请求的login函数。


def login(request):
  """登录处理函数"""
  # 获取cookie username
  if 'username' in request.COOKIES:
    username = request.COOKIES['username']
  else:
    username = ''
  return render(request, "booktest/login.html", {'usernam': username})

最后配置相应的URL路由规则。


url(r'^login/$', views.login), 
url(r'^login_check/$', views.login_check),

Django中Session的原理与方法

Session是另一种重要的状态保持机制。

与Cookie不同,Session数据存储在服务器端。

Session具备以下主要特征:

  • 1) Session同样以键值对的形式进行数据存储。
  • 2) Session的运行依赖于Cookie,其唯一的标识符sessionid保存在客户端的Cookie中。
  • 3) Session也设有过期时间,若未特别指定,默认两周后过期。

下面介绍Django中Session对象及其常用方法。

主要涉及对象的属性及操作方法。

开发者可以通过HttpRequest对象的session属性来执行会话数据的读写操作。

1) 以键值对的格式写入Session数据。

request.session['键']=值

2) 根据指定的键名读取对应的值。

request.session.get('键',默认值)

3) 清除所有Session数据,这会在存储介质中删除值部分,但保留Session记录本身。

request.session.clear()

4) 彻底清除Session数据,这会在存储介质中删除该Session的整条记录。

request.session.flush()

5) 删除Session中指定的键及其对应的值,仅从存储中移除特定的键值对。

del request.session['键']

6) 设置会话的超时时间,若未指定过期时间,默认两周后过期。

request.session.set_expiry(value)

  • 如果value参数是一个整数,表示会话将在该数值指定的秒数内无活动后自动过期。
  • 如果value值为0,表示用户会话的Cookie将在用户关闭浏览器时立即过期。
  • 如果value值为None,表示会话将永不过期。

Session使用示例与过期机制

以下是Session使用的具体代码示例。


# 设置session
def set_session(request):
  """设置session"""
  request.session['username'] = 'yifchan'
  request.session['age'] = 18
  request.session.set_expiry(10) # 设置session的有效时间为10s
  return HttpResponse('设置session成功')


# 获取session
def get_session(request):
  """获取session"""
  username = request.session['username']
  age = request.session['age']
  info = username + ":" + age
  return HttpResponse(info)


# 清除session
def clear_session(request):
  """清除session信息"""
  # request.session.clear() # 只会清除有用信息部分,但这整条信息不回被清除
  request.session.flush() # 清除整条session信息
  return HttpResponse("清除session成功")

需要注意:所谓的Session过期,实际上是指浏览器端存储的Cookie中的sessionid标识符已过期。

Cookie与Session的应用场景对比

最后分析Cookie和Session在实际应用中的不同场景。

Cookie适用于安全性要求不高的场景,例如记住用户名。而Session适用于安全性要求较高的数据场景,例如涉及银行卡账户、密码等敏感信息。

综上所述,本文介绍了Django中Cookie和Session的核心概念与使用方法。

希望以上内容对大家有所帮助,如有任何疑问欢迎留言,小编会及时回复。感谢大家对本站的支持!如果觉得本文对您有帮助,欢迎转载,烦请注明出处,谢谢!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。