状态保持以及Cookie和session

状态保持

  • 浏览器请求服务器是无状态无记忆的。
  • 无状态无记忆原因:浏览器与服务器是使用Socket进行通信的,服务器将请求结果返回给浏览器,会关闭当前的Socket连接,而且服务器也会处理页面完毕之后销毁页面对象。
  • 有时需要保持用户浏览的状态,所有我们要实现状态保持。
    1. 在客户端存储信息使用cookie
    1. 在服务器存储信息使用session

Cookie 是保持在客户端,基于域名(Domain)的

  1. 设置Cookie
def set_cookie(request):
 
    username = request.GET.get('username')
    response = HttpResponse('set_cookie')
    # 通过HttpResponse对象的set_cookie方法来设置cookie
    # max_age单位为秒, 默认是None 如果是临时cookie,可不设置
    response.set_cookie('username', username, max_age=3600)
    return response
  1. 读取Cookie
def get_cookie(request):

    cookie = request.COOKIES
    username = cookie.get('username')
    return HttpResponse('get_cookie:', username)

3.Cookie的请求流程

  • 第一次请求过程
    ① 我们的浏览器第一次请求服务器的时候,不会携带任何cookie信息
    ② 服务器接收到请求之后,发现 请求中没有任何cookie信息
    ③ 服务器设置一个cookie.这个cookie设置在响应中
    ④ 我们的浏览器接收到这个响应之后,发现响应中有cookie信息,浏览器会将cookie信息保存起来
  • 第二次以及以后请求过程
    ⑤ 当我们的浏览器第二次及其之后的请求都会携带cookie信息
    ⑥ 我们的服务器接收到请求之后,会发现请求中携带的cookie信息,这样的话就认识是谁的请求了

4.从HTTP协议角度深度掌握Cookie流程

  • 第一次
    ① 我们是第一次请求服务器,不会携带任何cookie信息,请求头中没有任何cookie信息
    ② 服务器会为响应设置cookie信息. 响应头中有set_cookie信息
  • 第二次及其之后的
    ③ 我们第二次及其之后的请求都会携带cookie信息,请求头中有cookie信息
    ④ 在当前我们的代码中,没有在响应头中设置cookie,所以响应头中没有set_cookie信息

Session是保存在服务器 依赖于Cookie,禁用Cookie则Session无法实现

1.启用Session
Django项目默认启用Session。

image.png

2.存储方式

  • 存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。
SESSION_ENGINE='django.contrib.sessions.backends.db'
# 如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',  # 安装Session应用
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book.apps.BookConfig',
]
  • 本地缓存 存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。
SESSION_ENGINE='django.contrib.sessions.backends.cache'
  • 混合存储 优先从本机内存中存取,如果没有则从数据库中存取。
SESSION_ENGINE='django.contrib.sessions.backends.cached_db
  • 在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。
1) 安装扩展
pip install django-redis
2)配置

在settings.py文件中做如下设置

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

3.设置Session

def set_session(request):
    # 1.cookie中没有任何信息
    print(request.COOKIES)
    #2.对用户名和密码进行验证
    # 假设认为 用户名和密码正确
    user_id=6666
    #3.设置session信息
    # 设置session的时候其实 session做了2件事
    #第一件: 将数据保存在数据库中
    #第二件: 设置一个cookie信息,这个cookie信息是以sessionid为key
    request.session['user_id']=user_id

    #4. 返回响应
    return HttpResponse('set_session')

4.读取Session信息

def get_session(request):
    # . 请求都会携带 session id信息
    print(request.COOKIES)

    # 2. 会获取到sessionid信息,然后进行验证,
    # 验证成功,可以获取 session信息(
    # request.session 字典
    user_id=request.session['user_id']
    user_id=request.session.get('user_id')
    # 3.返回响应
    return HttpResponse('get_session')

5.Session流程

  • 第一次请求:
    ① 我们第一次请求的时候可以携带一些信息(用户名/密码) cookie中没有任何信息
    ② 当我们的服务器接收到这个请求之后,进行用户名和密码的验证,验证没有问题可以设置session 信息
    ③ 在设置session信息的同时(session信息保存在服务器端).服务器会在响应头中设置一个 sessionid 的cookie信息
    ④ 客户端(浏览器)在接收到响应之后,会将cookie信息保存起来(保存 sessionid的信息)
  • 第二次及其之后的请求:
    ⑤ 第二次及其之后的请求都会携带 session id信息
    ⑥ 当服务器接收到这个请求之后,会获取到sessionid信息,然后进行验证,
    验证成功,则可以获取 session信息(session信息保存在服务器端)

6.HTTP协议角度深度掌握Session流程
① 第一次请求,在请求头中没有携带任何cookie信息
② 我们在设置session的时候,session会做2件事.
#第一件: 将数据保存在数据库中
#第二件: 设置一个cookie信息,这个cookie信息是以sessionid为key value为 xxxx
③ 第二次及其之后的:都会携带 cookie信息,特别是 sessionid

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342