<学习笔记>从零开始自学Python-之-web应用框架Django( 十三)Django会话 cookie 和 session

1、会话技术

        HTTP 本身是无状态的,两次请求之间没有连续性,服务器无法知晓后续请求是不是来自同一个人。 这种状态上的缺失由会话(session)弥补。会话是位于浏览器和 Web 服务器之间的半永久性双向通信。


典型的实现方式有两种:

cookie 和 session
其中cookie是根本,Session是高级实现(session也是基于cookie)

其目的:
a) 在同一个浏览器的多次请求将可以存储数据。
b) 严格区分浏览器。

cookie、session、token

cookie: 客户端浏览器上的键值对
session: 存在服务端的键值对
token: 加密的键值对,如果放在客户端浏览器上,它就叫cookie,服务端签发的加密字符串,如果在app上就叫token

2、cookie

2.1、定义

        cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息
a) 当前网站在浏览器上cookie个数和大小有限制
b) cookie大小上限为4KB
c) 一个服务器最多在客户端浏览器上保存20个cookie
d) 一个浏览器最多保存300个cookie

2.2、基本原理

服务器端脚本在浏览器端存储数据的一种技术
a) cookie会话数据存储在浏览器端
b) 浏览器在每次请求服务器程序时,会将该服务器所存储的cookie,携带到服务器端
c) 究竟存储那些数据由服务器决定


2.3、django中cookie的简单使用

2.3.1、设置cookie
 

def cookie_set(request):
    # 浏览器向我这个地址发一个请求,就在浏览器写入 name = '王重阳'
    obj = HttpResponse('设置cookie')
    obj.set_cookie('name','王重阳')  # 写入到浏览器了,在http响应头里: cookie: name='王重阳'
    obj.set_cookie('age','39')  # 写入到浏览器了,在http响应头里:cookie: age=39
    return obj


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

2.3.2 获取cookie

def cookie_get(request):
    print(request.COOKIES)
    print(request.COOKIES.get('name'))
    return HttpResponse('获取cookie')

2.3.3 删除cookie

def cookie_delete(request):
    obj = HttpResponse('删除指定cookie ')
    obj.delete_cookie('name')
    return obj

2.3.4 django中cookie的常用操作

# django中操作cookie
增: obj.set_cookie('key','value')
删: obj.delete_cookie('key')  # 设置过期
查: request.COOKIES.get('key')
改: obj.set_cookie('key','value1')

# 带签名的cookie(加盐,加密)
增: obj.set_signed_cookie('key','value','密钥')
删: obj.delete_cookie('key')  # 设置过期
查: request.get_signed_cookie('key',salt='密钥')
改: obj.set_signed_cookie('key','value1','密钥')

3、session

3.1、定义

1、存在于服务端的键值对
2、同一个浏览器不允许登录多个账户,不同浏览器可以登录同一个账户

3.2、django中session的使用
重要: 必须迁移数据库!!!

增: request.session['key']=value
查: request.session['key']
改: request.session['key']=value1
删: del request.session['key']
设置过期时间: request.session.set_expiry(10)

  
# session的其它使用

# 以下6个用法跟字典使用方法一样
request.session.setdefault('key',value)
request.session.get('key',None)
del request.session['key']
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()   # 删除所有的值,django_session表中删除当前登录者的这条记录,并把cookie设置为过期


3.3、django中session的配置

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'        # 引擎

5、加密cookie session

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

6、其他公用设置项:

SESSION_COOKIE_AGE = 1209600                             # session的cookie失效日期(2周)(默认)
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,默认修改之后才保存(默认)

你可能感兴趣的:(python基础自学笔记,Django,django,学习,前端,python)