django的会话控制技术cookie和session

会话控制

网络中网页之间进行内容传输使用的协议是http协议.

http协议是一种无状态, 所有请求必有所回应的超文本传输协议,HTTP为了提升效率,一经完成请求和响应的过程以后,就会自动关闭连接。所谓无状态意指: 基于http协议提供服务的服务端,无法清晰前后多次请求过程中,是不是同一个客户端发送的还是多个客户端发送的.

web开发的应用往往不仅仅只是一个网页或一个功能,那么怎么多个页面不同的请求,识别用户之前的状态和行为?

为了能在多次请求过程中,识别客户端是否是同一个客户端,所以就出现了会话跟踪技术,就需要使用会话控制技术, 也叫会话保持或者会话跟踪技术.

会话控制技术,主要作用是为了识别和记录用户在web应用中的身份行为和操作历史.

基本概念

会话的单词:session,所谓一次会话其实就是客户端和服务端之间进行通信的一次完整过程.

在web开发领域:

客户端和服务端之间产生的会话开始于: 在用户第一次输入url访问网站的时候

客户端和服务端之间的会话结束于关闭浏览器

注意: 如果移动端下面,则必须是关闭当前app应用才算结束会话,如果只是后台运行,会话并没有结束的.

所以, 会话跟踪技术就是在一次完整的会话中,能让服务端识别客户端在整个过程中的身份行为和操作历史的一项技术.

实现会话控制的几种技术类型:

1. url地址栏记录用户身份的参数[少见,很古老的技术了]
2. cookie: 在浏览器中由浏览器自动读写保存用户信息的一种小文件. 能够存储的数据有限.10M左右.[过时了,谷歌在2021开始慢慢关闭这个cookie技术了]
3. session: 在服务端中保存用户信息的一种小文件.能够存储的数据有限.根据服务端配置而定
4. token令牌: 就是一段可以记录和识别用户身份的字符串.通过客户端语言[js/安卓/ios]保存在客户端中一项技术,

cookie

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

cookie实现会话控制的原理

 

 

 

cookie路由代码:

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就是会话控制技术的一种, session主要保存在服务器的文件中.

在没有进行设置的情况下,session以 文件编码格式保存, 一般保存的目录是系统的缓存文件存储目录.

例如: windows的C:/windows/temp目录 ,Linux/Mac OS的/tmp目录

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

session原理

 

 django中在2.0以后的版本默认采用了数据库保存session,这主要为了适应当前市面上大部分公司开发项目采用分布式服务器集群而调整的.

在配置文件中的settings.py。

# 配置项
# session核心类
SESSION_ENGINE = "django.contrib.sessions.backends.file"
# 保存到文件: django.contrib.sessions.backends.file
# 保存到数据库: django.contrib.sessions.backends.db    # 需要配置数据库连接
# 保存到缓存中: django.contrib.sessions.backends.cache # 需要配置缓存连接

# session存储目录[如果不设置,则默认是系统的缓存目录]
# 3.0以前的django 通过以下代码配置
# SESSION_FILE_PATH = os.path.join(BASE_DIR, "session")
# 3.0以后通过以下配置
SESSION_FILE_PATH = BASE_DIR / "session_path"   # 路径拼接

 

保存session

def set_session(request):
    """设置session"""
    # session保存在服务端,所以所有关于session的操作都是由request.session来完成的
    #
    request.session["uname"] = "root"
    request.session["uid"] = 1
    print(request.session.serializer) # b'{"uname":"root","uid":1}'
    return HttpResponse("设置session数据")

读取session

def get_session(request):
    """获取session"""
    print(f"uname={request.session.get('uname')}") # format string python3.6提供的
    print(f"uid={request.session.get('uid')}")
    # 获取session数据的有效,默认值是:2周 ==>  60 * 60 * 24 * 7 * 2
    print(request.session.get_session_cookie_age() )
    return HttpResponse("获取session数据")

删除session

def del_session(request):
    """删除session数据"""
    # 删除单个指定名称的session
    try:
        del request.session["uid"]
    except KeyError:
        pass

    # 获取session所有的键值对
    print(request.session.items())

    # 删除所有的session,慎用
    request.session.clear()
    return HttpResponse("删除session数据")

 

posted @ 2021-07-05 20:40  Fleeting__Time  阅读(92)  评论(0编辑  收藏  举报