目录

  • Cookie
  • 1、Cookie的特点
  • 2 、cookie的基本操作
  • Session
  • 1、Session 的作用
  • 2、 Session的特点
  • 3、启用Session
  • 4、存储方式
  • 4.1 数据库存储
  • 4.2 文件
  • 4.3 本地缓存
  • 4.4 混合存储
  • 4.5 Redis存储
  • 4.6 Django自带的sqlite存储
  • 5、Session操作


Cookie

有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。

Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等。服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型记住用户名。

Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用。

1、Cookie的特点

Cookie以键值对Key-Value形势进行信息的存储。
保存在用户浏览器端的键值对, 向服务端发请求时会自动携带
Cookie基于域名安全,不同域名的Cookie是不能互相访问的

2 、cookie的基本操作

# 设置Cookies,可以通过HttpResponse对象中的set_cookie方法来设置cookie。
    HttpResponse.set_cookie(cookie名, value=cookie值, max_age=cookie有效期)
    max_age 单位为秒,默认为None。如果是临时cookie,可将max_age设置为None。
    例:response.set_cookie("cookie_key","value")
    
    # 获取Cookies(字典类型)
    value = request.COOKIES["cookie_key"]
    request.COOKIES.get('xx')
    
    # 删除Cookies
    response.delete_cookie("cookie_key",path="/",domain=name)
    
    # 检测Cookies
    if "cookie_name" is request.COOKIES :
    
    # rep.set_signed_cookie(key,value,salt='加密盐',...)
    参数:
        key,              键
        value='',         值
        max_age=None,     超时时间,表示多少秒数之后失效
        expires=None,     超时时间,表示失效的时间点。支持datetime 和 time.time
        path='/',         Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
        domain=None,      Cookie生效的域名
        secure=False,     https传输
        httponly=False    只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)

    由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。
    <script src='/static/js/jquery.cookie.js'></script>
    $.cookie("list_pager_num", 30,{ path: '/' });

Session

称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

1、Session 的作用

Session 的作用就是它在 Web服务器上保持用户的状态信息供在任何时间从任何设备上的页面进行访问。因为浏览器不需要存储任何这种信息,所以可以使用任何浏览器,即使是像 Pad 或手机这样的浏览器设备。

2、 Session的特点

一种存储数据的方式,依赖cookies
存储敏感、重要的信息
支持更多字节
Session共享问题
Session配置和存储
用户向服务端发送请求, 服务端做两件事,生成随机字符串,为此用户开辟一个独立的空间来存放当前用户独有的值.

3、启用Session

Django项目默认启用Session,可以在settings.py文件中查看

python中cookie 中文乱码 python的cookies_python


禁用session,将上图中的session中间件注释掉即可。

4、存储方式

在settings.py文件中,设置session数据的存储方式:内存缓存存储、文件存储、数据库存储。

Django中session相关的配置

SESSION_ENGINE=‘django.contrib.sessions.backends.db’
# Session的存储方式
SESSION_COOKIE_NAME = "sessionid" 
# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_DOMAIN = None 
# api.baidu.com /www.baidu.com/ xxx.baidu.com
SESSION_COOKIE_PATH = "/" 
# Session的cookie保存的路径
SESSION_COOKIE_HTTPONLY = True 
# 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 
# Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False 
# 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False 
# 是否每次请求都保存Session,默认修改之后才保存

4.1 数据库存储

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。

SESSION_ENGINE=‘django.contrib.sessions.backends.db’

如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。

python中cookie 中文乱码 python的cookies_python_02

4.2 文件

服务器端本地存储

SESSION_ENGINE ='django.contrib.sessions.backends.file'
SESSION_FILE_PATH = '/sssss/'

4.3 本地缓存

存储在用户端内存中,如果丢失则不能找回,比数据库的方式读写更快。

SESSION_ENGINE=‘django.contrib.sessions.backends.cache’
    SESSION_CACHE_ALIAS = 'default'
    CACHES = {
        'default':{
            'BACKEND':'django.core.cache.backends.locmem.LocMemCache',
			'LOCATION': 'unique-snowflake',
		}
    }

4.4 混合存储

优先从用户端内存中存取,如果没有则从数据库中存取。

SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db’

4.5 Redis存储

在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。
1) 安装扩展

pip install django-redis

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

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

注意:

如果redis的ip地址不是本地回环127.0.0.1,而是其他地址,访问Django时,可能出现Redis连接错误,如下:

python中cookie 中文乱码 python的cookies_session_03


解决方法:

修改redis的配置文件,添加特定ip地址。打开redis的配置文件

sudo vim /etc/redis/redis.conf

在如下配置项进行修改(如要添加10.211.55.5地址)

python中cookie 中文乱码 python的cookies_数据库_04

重新启动redis服务

sudo service redis-server restart

4.6 Django自带的sqlite存储

1)settings配置:

SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_NAME = 'xxxx'
SEESION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_COOKIE_AGE = 18000

设定的时间作用不大,可直接在代码里指定时间:

request.session.set_expiry(0) 
参数0代表退出浏览器session即失效,单位均为毫秒

中间件MIDDLEWARE中查看是否有’django.contrib.sessions.middleware.SessionMiddleware’ ,没有添加即可

2)使用django自带的模块处理session值,用sqlite数据库存储session需要初始化数据库,在manage.py文件所在目录下执行命令:

python manage.py makemigrations
python manage.py migrate

3)session失效只是时间上失效,其值还是存在库中,因此需要定期删除,可以代码中逻辑删除

# coding=utf-8
import sys
 
reload(sys)
sys.setdefaultencoding('utf-8')
import datetime
from django.contrib.sessions.backends.db import SessionStore
from django.contrib.sessions.models import Session
 
 
def delsession(key):
if key is None:
return
store = SessionStore()
store.delete(key)
count = Session.objects.all().count()
if count > 20:
nowtime = datetime.datetime.now()
outdatesession = Session.objects.filter(expire_date__lt=nowtime)
for item in outdatesession:
store.delete(item.session_key)
 
 
def delovertimesession():
store = SessionStore()
count = Session.objects.all().count()
if count > 20:
nowtime = datetime.datetime.now()
outdatesession = Session.objects.filter(expire_date__lt=nowtime)
for item in outdatesession:
store.delete(item.session_key)

4)请求的中间件

安全认证、请求过滤以及session的初始值 我们可以在中间件中处理。
在django common项目下,新增middlehttp.py文件,代码大致如下:

reload(sys)
sys.setdefaultencoding('utf-8')
 
from django.shortcuts import render_to_response
 
 
# process_request -------- 接受request之后确定view之前执行
# process_view 确定view之后 并且在view真正执行之前执行
# process_response view执行之后
# process_exception(self, request, exception) view抛出异常
 
class LoginRequiredMiddleware:
 def process_request(self, request): 
  path = request.path_info.strip('/')
  #这里写处理逻辑和请求控制

在settings文件中的中间件配置MIDDLEWARE_CLASSES中添加’djangocommon.middlehttp.LoginRequiredMiddleware’ 如下:

MIDDLEWARE_CLASSES = [
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',   'djangocommon.middlehttp.LoginRequiredMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

注意必须在SessionMiddleware后

5、Session操作

通过HttpRequest对象的session属性进行会话的读写操作。

# 以键值对的格式写session
    request.session[‘键’]=值
    
    # 根据键读取值
    request.session[‘键’] (没有数据会报错)
    request.session.get(‘键’)
    
    #清除所有session,在存储中删除值部分
    request.session.clear()
    
    #清除session数据,在存储中删除session的整条数据
    request.session.flush()
    
    # 删除session中的指定键及值,在存储中只删除某个键及对应的值
    del request.session[‘键’]
    
    # 设置session的有效期
    request.session.set_expiry(value)
    注:
    如果value是一个整数,session将在value秒没有活动后过期。
    如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
    如果value为None,那么session有效期将采用系统默认值,默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。
    
    # 其他操作
    request.session.keys()    # 取键
    request.session.values()  # 取值
    request.session.items()   # 取键值对
    request.session.set_expiry(value)  # 设置过期时长, 可以是整数(秒), 可以是datetime
    request.session.session_key # 取随机字符串