cookies和session
http协议
无连接 无状态 --> 维持不了会话
cookie
首先来讲,cookie是浏览器的技术,Cookie具体指的是一段小信息,它是服务器发送出来存储在浏 览器上的一组组键值对,可以理解为服务端给客户端的一个小甜点,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。
cookie的工作原理是:浏览器访问服务端,带着一个空的cookie,然后由服务器产生内容,浏览器收到相应后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
不同浏览器之间的cookie是不共享的 !
# 设置cookie:
ret = HttpResponse('ok')
ret.set_cookie('k1','v1')
cookie设置中文(一般不设置)
import json
json_str = json.dumps('你好')
ret.set_cookie('k1',json_str)
其他参数
msx_age 有效时间,秒为单位,默认为2周
expire 有效时间,datetime日期格式
# cookie取值:
request.COOKIES['k1']
request.COOKIES.get('k1')
中文cookie取值
json.loads(request.COOKIES['k1'])
# 删除cookie:
rep.delete_cookie('k1')
Cookie规范
1.Cookie大小上限为4KB;
2.一个服务器最多在客户端浏览器上保存20个Cookie;
3.一个浏览器最多保存300个Cookie,因为一个浏览器可以访问多个服务器;
4.不同浏览器之间的cookie是不共享的.
session
cookie是明文显示,存在数据安全问题;同时创建多个cookie(键值对)的时候管理很繁琐;而且有大小上限限制.
session只返回给浏览器一个键值对sessionid(钥匙),并将用户数据加密存放到服务端数据库,用户之后可以用钥匙访问.
# 设置session:
request.session['is_login'] = True
# session取值:
is_login = request.session['is_login'] 这样取值取不到会报错
is_login = request.session.get('is_login')
# 常用删除会话数据:
def logout(request):
request.session.flush() # 删除当前的会话数据并删除会话的Cookie
return redirect('login')
形象对比记忆
cookie:一个用户通过浏览器带个空的cookie兜兜来访问我服务端,我给它兜里放了个小甜点(键值对)带回去,之后它拿着这个小甜点来找我我就认识他了.期间cookie是要经过网络传输的.
session:一个用户通过浏览器带个空的cookie兜兜来访问我服务端,我给它兜里放了把钥匙带回去,并自己在服务端数据库创建了一条关于这个浏览器的这个用户的数据,之后它带着这把钥匙来找我,我拿到钥匙先去我数据库里找找是不是他.期间session一直在本地数据库里,不用经过网络传输.
通过csrf_token认证的另一种方法
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt # 允许跨站请求
def func(request):
...
@csrf_protect # 不允许跨站请求,强制保护
def func1(request):
...