Django——cookie session token 及其在django中使用 一、cookie session token 二、django中cookie的使用 三、django中session的使用 四、django中session的配置

1 cookie:客户端浏览器上的键值对
2 session:存在服务端的键值对
3 token: 服务端签发的加密字符串   (加密的键值对,如果放在客户端浏览器上,它就叫cookie)
比如:
head.{name:lqz,age:18}.eseetsweasdca
base64加码后变成:
asdfasfd.asdfasdf.asdfasdfaeraew

后端校验:
用这个token去查我的账户余额,向银行发请求,银行校验通过,是银行给你的,---》返回你的余额
比如:head.{name:lili,age:18}.eseetsweasdca 服务端可以匹配上,允许访问
    eseetsweasdca的生成跟{name:lili,age:18}对应的
但是head.{name:egon,age:18}.eseetsweasdca  name变了后服务端就匹配不成功了

二、django中cookie的使用

1.知识储备

# 0 会话跟踪,会话保持
# 1 cookie规范
    -记住:当前网站在浏览器上cookie个数和大小有限制
    -在服务端朝响应头里写cookie,到浏览器后会读出来,把k=v k=v存到浏览器里,下次浏览器再发送请求,浏览器会把放在浏览器里的cookie自动包装到http请求中去,
   之后到了django框架,解析http把cookie放到字典里,jdango矿机会把所有的k v转到request.COOKIE字典里,在字典里就可以取出来了
-Cookie大小上限为4KB; -一个服务器最多在客户端浏览器上保存20个Cookie; -一个浏览器最多保存300个Cookie; # 2 django中操作cookie -增:obj.set_cookie('key','value') -删: obj.delete_cookie('key') # 实质是设置过期 -查: request.COOKIES.get('key') -改: obj.set_cookie('key','value1') # 3 带签名的cookie(加盐,加密) -增:obj.set_signed_cookie('name','lili','123') -删: obj.delete_cookie('name') # 实质是设置过期 -查: request.get_signed_cookie('name',salt='123') -改: obj.set_signed_cookie('name','guo','1234')

2.普通版

urls.py略

views.py

from django.shortcuts import HttpResponse

def cookie_test(request):
    # 浏览器向我这个地址发一个请求,就在浏览器写入 name = zhangsan
    obj=HttpResponse('ok')
    obj.set_cookie('name','zhangsan')  # 写入到浏览器了,在http响应头里:cookie: name=zhangsan
    obj.set_cookie('age','19')  # 写入到浏览器了,在http响应头里:cookie: age=19
    return obj

def get_cookie(request):
    print(request.COOKIES)
    print(request.COOKIES.get('name'))
    return HttpResponse('我拿了你传过来的cookie')

def delete_cookie(request):
    obj=HttpResponse('我删掉了你 name 这个cookie ')
    obj.delete_cookie('name')
    return obj

 3.加盐加密版

urls.py略

views.py

def set_cookie(request):
    obj = render(request, 'index.html')
    obj.set_signed_cookie('name', 'lili', 'aaaa') #增  改 
    obj.delete_cookie('name')#
    return obj

def get_cookie(request):
    print(request.COOKIES.get('name')) #
    print(request.get_signed_cookie('name',salt='123'))#
    return HttpResponse('获取成功')

三、django中session的使用

 1.知识储备

1 session是存在于服务端的键值对

2 同一个浏览器不允许登录多个账户,不同浏览器可以登录同一个账户

3 session的使用(必须迁移数据)
    -增:request.session['name']=lqz
    -查:request.session['name']#查,没有会报错
    -改:request.session['name']=egon
    -删:del request.session['name']
    -设置过期时间:request.session.set_expiry(10) #防爬虫
    
4 session的其它使用
    -request.session.setdefault('k1',123)#有不改,没有新增
    -request.session.get('name',None)#查,没有不会报错
    -del request.session['k1'] #
    
    -request.session.keys()
    -request.session.values()
    -request.session.items()
    -request.session.session_key # 获取那个随机字符串,django_session表中session_key字段
    
    -request.session.clear_expired() # 清除过期的session
    -request.session.exists("session_key") # 判断这个随机字符串(session_key字段),有没有数据
    -request.session.delete() # 删除所有的值,django_session表中删除当前登录者的这条记录
    -request.session.flush()  # 干了request.session.delete()这个事后,把cookie设置为过期

2.代码views.py

Django中使用session时,做的事:

# 生成随机字符串
# 写浏览器cookie -> session_id: 随机字符串
# 写到服务端session:
    # {
    #     "随机字符串": {'user':'alex'}
    # }
# 设置session
# django框架默认,把session信息存到数据库中了,django_session表
# 先迁移数据库
def session_set(request):
    # request.session是个字典
    # 写了下面那一句话,干了如下几件事
    '''
        # 一个浏览器,一个随机字符串
        1 生成一个随机字符串asdfasdf,把随机字符串和name=lqz数据加密存到django_session表中(加密用的就是配置里SECRET_KEY里生成的随机密钥)
        2 会把这个随机字符串放到cookie中
            obj.set_cookie('sessionid',asdfasdf)
    '''
    request.session['name'] = 'lqz'
    request.session['age'] = 19

    return HttpResponse('session写入了')


def session_set2(request):
    request.session['name'] = 'egon'
    request.session['xx'] = 'xx'

    return HttpResponse('session写入了')


def session_get(request):
    # name=request.session.get('name') #用get查如果没有不会报错,[]取会报错
    # print(name)
    # print(request.session.keys())
    # print(request.session.values())
    # print(request.session.items())

    print(request.session.session_key)

    return HttpResponse('获取到了session')

四、django中session的配置

def set_cookie(self, key, value='', max_age=None, expires=None, path='/',
                   domain=None, secure=False, httponly=False)

# key
# value
# max_age:传个数字,以秒计,过期时间,有默认值 (5天后过期:60*60*24*5)
---了解
# expires:传时间对象,date=datetime.timedelta()
# path:默认 / 表示当前域下的所有路径  http://127.0.0.1:8000/lqz/dfd/
# domain:设置在哪个域下有效
# secure:是否Https传输cookie
# httponly:cookie只支持http传输

1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)

2. 缓存Session 这样速度快
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
SESSION_CACHE_ALIAS = 'default'                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'    # 引擎
SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 

4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

# 缓存中用pickle存是二进制的形式,用json是明文,不安全,但也可以把它转成二进制形式或加密

5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用设置项: SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)***记住,可以写成60*60*24*14别人容易看清 ---了解 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

代码关于path:

from django.shortcuts import render, HttpResponse, redirect

def set_cookie(request):
    print(request.session)
    obj = render(request, 'index.html')
    # obj.set_signed_cookie('name', 'lqz', '123',path='/lqz/')
    obj.set_cookie('name', 'lqz', path='/lqz/') #只有在朝跟路径后面加 着/lqz/发请求才会携带 cookie
    return obj