Django 基础 3 --会话控制(未完成)

309 阅读4分钟
  • 网络中网页之间进行内容传输使用的是HTTP 协议,HTTP 协议使用无状态,所有请求必须有相应的超文本传输协议。
  • 请求和相应过程结束后,HTTP 协议会自动管理。
  • 无状态意指: 基于http协议提供服务的服务端,无法清晰前后多次请求过程中,是不是同一个客户端发送的还是多个客户端发送的。
  • 为了能在多次请求过程中,识别客户端是否是同一个客户端,所以就出现了会话跟踪技术,就需要使用会话控制技术, 也叫会话保持或者会话跟踪技术。

会话

  • session,指的是客户端与服务端之间进行一次完整的通信过程
  • 在web 开发领域:开始与一次浏览器的 url 访问网站请求,结束于浏览器的关闭
  • 集中创建的会话控制技术
    • url: 地址栏记录用户身份的参数(很少很少)
    • cookie:在浏览器中由浏览器自动读写保存用户信息的一种小文件. 能够存储的数据有限.10M左右。[过时了,谷歌在2021开始慢慢关闭这个cookie技术了]。
    • session:在服务端中保存用户信息的一种小文件.能够存储的数据有限.根据服务端配置而定
    • token令牌:就是一段可以记录和识别用户身份的字符串.通过客户端语言[js/安卓/ios]保存

cookie

cookie是保存在浏览器中的小文本,由浏览器自动管理和收发, 所以cookie中不要保存用户的敏感信息,例如: 密码之类的.而且cookie在浏览器中用户是可以关闭cookie功能的.如果关闭了cookie功能,一般服务端能做的就只有2个事情了:1. 提示用户开启cookie功能, 2. 不要使用cookie了.

cookie实现会话控制的原理

  1. 客户端(浏览器)发起 url 网页请求,服务端识别用户身份
  2. 服务端生成 cookie 中,保存到响应头中传回给客户端。
  3. 浏览器识别响应头中的 cookie,并记录在文件中,,我们可以通过 f12 的 application 选项查看网站的 cookie 信息 4.浏览器下次发起相同网页请求时,自动将 cookie添加到请求头,客户端接收到 cookie。

users.urls.py,代码:

from django.urls import path
from . import views
urlpatterns = [
    path("set_cookie", views.set_cookie),
    path("get_cookie", views.get_cookie),
    path("del_cookie", views.del_cookie),  # ctrl+d 复制光标所在的一行内容
]

保存cookie

在服务端生成cookie,发送到客户端浏览器保存,视图代码:

from django.http.response import HttpResponse
# Create your views here.
def set_cookie(request):
    """先判断用户身份"""

    """身份正确, 生成cookie"""
    response = HttpResponse("设置cookie")
    # 生成cookie
    """
    参数列表:
        key,             # 键/变量
        value='',        # 值/内容
        max_age=None,    # 设置cookie的有效时间,单位: 秒
        expires=None,    # 设置cookie的过期时间戳[时间戳表示从1970-01-01 00:00:00至今的总秒数]
                         # datetime.now().timestamp() 获取时间戳
                         # int( time.time() * 1000 )  获取毫秒时间戳
                         # datetime.now().timestamp() 获取毫秒时间戳
                         
        path=None,       # 当前cookie是否只能在指定公共路径下使用,None表示在同一个域名下,任意路径都可以使用
        domain=None,     # 当前cookie是否只能在指定同一段域名下使用,None表示在当前服务器所在域名下使用
        secure=False,    # 当前cookie是否只能在https协议下使用,False表示在http协议下也能使用    
        httponly=False,  # 当前cookie是否只能在http协议下使用,False表示在其他协议下也可以使用
    """
    # 设置cookie信息,并设置30秒后过期,
    # cookie会一直持续保存在浏览器直到过期时间来临,这个过程除了客户端自己删除以外,即便关闭浏览器也不会改变
    response.set_cookie("uname", "xiaoming",max_age=5)
    response.set_cookie("uid", 100, max_age=180)
    # 设置cookie信息,可以不设置过期时间,默认cookie有效期的就是浏览器关闭时删除[会话结束时删除]
    response.set_cookie("is_login", True, )
    return response

读取cookie

在客户端中发送cookie, 服务端接收并读取cookie

def get_cookie(request):
    """通过request.COOKIES可以获取客户端发送过来的cookie"""
    print(request.COOKIES) # 获取所有cookie
    print(request.COOKIES.get("uname")) # 获取指定名称cookie
    return HttpResponse("获取cookie")

删除cookie

在服务端中删除cookie,在客户端中根据服务端的提示删除cookie

def del_cookie(request):
    """删除cookie,在服务端是做不到的,因为cookie在客户端,所以我们需要通知客户端自己去删除"""
    # 告诉浏览器,cookie过期了
    response = HttpResponse("告诉客户端,删除cookie")
    response.set_cookie("uid","",max_age=0) # 设置有效期为0秒,当浏览器接受响应内容时,0秒早就到了,所以会自动删除
    return response

session

  • 主要保存在服务器的文件中

因为session是在服务端中保存数据,相对而言比cookie要安全.但是因为用户的数据都保存到服务器中,当用户基数大了,则服务器的存储压力就来了.所以一般不会考虑把session数据保存在文件,而是才采用的存储方案,例如保存到redis或者mysql之类的数据库里面。

原理

token