http请求无状态:
所谓http是无状态协议,言外之意是说http协议无法保存客户机信息,也就无法区分每次请求的不一样之处。python
保持http状态的技术cookie和session:web
cookie:数据库
cookie:cookie的出现就是为了解决http请求无状态的问题,第一次登陆后服务器返回一些数据(cookie)给浏览器,而后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器经过浏览器携带的数据进行一些自定义的操做就能判断当前用户是哪一个了。可是cookie机制也是有缺陷的,首先cookie存储的数据量有限,不一样的浏览器有不一样的存储大小,但通常不超过4KB,其次,cookie存储的是明文信息,这样可能会形成一些安全隐患。为了弥补cookie的这些缺陷,session应运而生。django
session:
session和cookie的做用有点相似,都是为了存储用户相关的信息。不一样的是,cookie是存储在本地浏览器,而session则是一个思路、一个概念、一个服务器存储受权信息的解决方案,不一样的服务器,不一样的框架,不一样的语言有不一样的实现。虽然实现不同,可是他们的目的都是为了服务器更方便存储数据的。与此同时,session的出现,解决了cookie存储数据不安全的问题的。flask
cookie和session联合使用:浏览器
web开发发展至今,cookie和session的使用已经出现了一些很是成熟的方案。session通常有两种存储方式:
一、存储在服务端:经过cookie存储一个sessionid,而后具体的数据则是保存在session中。若是用户已经登陆,则服务器会在cookie中保存一个sessionid,下次再次请求的时候,会把该sessionid携带上来,服务器根据sessionid在session库中获取用户的session数据。就能知道该用户究竟是谁,以及以前保存的一些状态信息。这种专业术语叫作server side session。Django中session的存储就是这种机制,信息默认存储到数据库中(自动生成的django_session表),固然也能够存储到其余地方,好比缓存中,文件系统中等。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有必定的弊端,就是会占用服务器的资源,但如今服务器已经发展至今,一些session信息仍是绰绰有余的。
二、将session数据加密,而后存储在客户端cookie中。这种专业术语叫作client side session。flask框架默认采用的就是这种方式,可是也能够替换成其余形式缓存
django中操做cookie:安全
设置cookie:
cookie是设置值给浏览器用来保存的,所以咱们须要经过response的对象来设置,设置cookie能够经过response.set_cookie来设置,set_cookie方法在使用时传递的相关参数以下:服务器
key:这个cookie的key。
value:这个cookie的value。
max_age:最长的生命周期。单位是秒。
expires:过时时间。跟max_age是相似的,只不过这个参数须要传递一个具体的日期,好比datetime或者是符合日期格式的字符串。若是同时设置了expires和max_age,那么将会使用expires的值做为过时时间,若是expires和max_age都未设置,那么过时时间就是浏览器关闭时,若是设置的expire时间比当前时间还小,那么cookie的过时时间就是设置时间,即设置即过时。
path:对域名下哪一个路径有效。默认是对域名下全部路径都有效。
domain:针对哪一个域名有效。默认是针对主域名下都有效,若是只要针对某个子域名才有效,那么能够设置这个属性.
secure:是不是安全的,若是设置为True,那么只能在https协议下才可用。
httponly:默认是False。若是为True,那么在客户端不能经过JavaScript进行操做。cookie
删除cookie:
cookie的删除也是在浏览器上删除,因此也是经过response对象进行删除。删除时只要调用delete_cookie方法便可,delete_cookie方法其实内部也是调用set_cookie方法,把max_age参数设置为0,即当即失效,delete_cookie的源码以下:
def delete_cookie(self, key, path='/', domain=None):
self.set_cookie(key, max_age=0, path=path, domain=domain, expires='Thu, 01-Jan-1970 00:00:00 GMT')
参数解析:
key:cookie设置时的key
path:cookie设置时的path,默认为'/',若是想要删除一个再设置时传递了path参数的cookie,那么这个参数必需要和设置时如出一辙,不然将没法删除
domain:与path同样理解便可
操做session:
django中的session默认状况下是存储在服务器的数据库中的,若是使用默认的存储机制,首先须要执行python manage.py migrate命令把迁移脚本文件映射到数据库,session存储的表默认为django_session表,在表中会根据sessionid来提取指定的session数据,而后再把这个sessionid放到cookie中发送给浏览器存储,浏览器下次在向服务器发送请求的时候会自动的把全部cookie信息都发送给服务器,服务器再从cookie中获取sessionid,而后再从数据库中获取session数据。可是咱们在操做session的时候,这些细节压根就不用管。咱们只须要经过request.session便可操做。
session经常使用的方法以下:
get:用来从session中获取指定值。
pop:从session中删除一个值,并将其返回,在使用时最好加上try语句,由于若是pop不存在的值,会报错。
keys:从session中获取全部的键。
items:从session中获取全部的值。
clear:清除当前这个用户的session数据。
flush:删除session而且删除在浏览器中存储的session_id,通常在注销的时候用得比较多。
set_expiry(value):设置过时时间。
整形:表明秒数,表示多少秒后过时。
0:表明只要浏览器关闭,session就会过时。
None:会使用全局的session配置。在settings.py中能够设置SESSION_COOKIE_AGE来配置全局的过时时间。默认是1209600秒,也就是2周的时间。
clear_expired:清除过时的session。Django并不会清除过时的session,须要按期手动的清理,或者是在终端,使用命令行python manage.py clearsessions来清除过时的session。
修改django中session的存储机制:
默认状况下,session数据是存储到数据库中的。固然也能够将session数据存储到其余地方。能够经过设置SESSION_ENGINE来更改session的存储位置,这个能够配置为如下几种方案:
一、django.contrib.sessions.backends.db:使用数据库。默认就是这种方案。
二、django.contrib.sessions.backends.file:使用文件来存储session。
三、django.contrib.sessions.backends.cache:使用缓存来存储session。想要将数据存储到缓存中,前提是你必需要在settings.py中配置好CACHES,而且是须要使用Memcached,而不能使用纯内存做为缓存。
四、django.contrib.sessions.backends.cached_db:在存储数据的时候,会将数据先存到缓存中,再存到数据库中。这样就能够保证万一缓存系统出现问题,session数据也不会丢失。在获取数据的时候,会先从缓存中获取,若是缓存中没有,那么就会从数据库中获取。
五、django.contrib.sessions.backends.signed_cookies:将session信息加密后存储到浏览器的cookie中。这种方式要注意安全,建议设置SESSION_COOKIE_HTTPONLY=True,那么在浏览器中不能经过js来操做session数据,而且还须要对settings.py中的SECRET_KEY进行保密,由于一旦别人知道这个SECRET_KEY,那么就能够进行解密。另外还有就是在cookie中,存储的数据不能超过4k。