cookie与session
一、cookie与session简介
知识点回顾
回忆:HTTP协议四大特性
1.基于请求响应
2.基于TCP、IP作用于应用层之上的协议
3.无状态
不保存客户端的状态
4.无连接
需求变化分析
最开始的网站都不需要用户注册 所有人来访问获取到的数据都是一样的
随着互联网的发展很多网站需要指定当前用户的状态,因此需要用到cookie和session
cookie
保存在客户端,存储与用户状态相关的信息
session
保存在服务端,存储与用户状态相关的信息
ps:session的工作需要依赖于cookie
补充:浏览器有资格拒绝保存服务端发送过来的cookie数据(需要在设置里设置,但都拒绝的话会出现不能登陆的情况)
我们可以在浏览器中右键检查查看cookies信息,如果我们主动删除这些cookies信息就需要重新登陆,如果短时间频繁操作,可能被某些网页检测到会封你ip(有人上课演示被封了,我也不知道是谁).
二、django操作cookie
要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收,因为我们如果要操作cookie就需要对三板斧产生的对象进行操作
obj1 = render()
return obj1
obj2 = HttpResponse()
return obj2
obj3 = redirect()
return obj3
首先实现一个本地Cookie的简单操作 通过后端传给Cookie 随时随地可以调用
views
def set_cookie(request):
obj = HttpResponse('Happy Happy !!!')
obj.set_cookie('name', 'James')
return obj
这里我们可以看到set_cookie方法把内部的数据发送到前端转换成了cookie.
同时我们可以在后端用request.COOKIES获取cookie信息
再来写一个登录账号跳转页面的情况吧!
这里的装饰器是用于判断cookie所代表的信息是否正确
def login_func(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
target_path = request.GET.get('next')
if target_path:
obj = redirect(target_path)
else:
obj = redirect('/home/')
obj.set_cookie('name', username)
return obj
return render(request, 'loginPage.html')
def login_auth(func_name):
def inner(request, *args, **kwargs):
# print(request.path) # 只获取用户输入的路由信息
# print(request.path_info) # 只获取用户输入的路由信息
target_path = request.path_info
# print(request.get_full_path()) # 获取用户输入的路由信息+问号后面携带的数据
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
return redirect('/login/?next=%s' % target_path)
return inner
@login_auth
def home_func(request):
return HttpResponse('home页面 只有登录的用户才可以查看')
@login_auth
def home1_func(request):
return HttpResponse('home1页面 只有登录的用户才可以查看')
@login_auth
def home2_func(request):
return HttpResponse('home2页面 只有登录的用户才可以查看')
在上面的代码中我们又联系实际情况,想到了一个问题,做的好一些的网站,通常都是会 记住我们之前访问的网页,在进行登陆有继续访问该网页.这里就需要用到一些小知识点了.也就是我们需要在装饰器中修改跳转的内容让他记住我们之前想要访问的网址.
def login_auth(func_name):
def inner(request, *args, **kwargs):
# print(request.path) # 只获取用户输入的路由信息
# print(request.path_info) # 只获取用户输入的路由信息
target_path = request.path_info
# print(request.get_full_path()) # 获取用户输入的路由信息+问号后面携带的数据
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
return redirect('/login/?next=%s' % target_path)
return inner
三、django操作session
由于session是保存在服务端上面的数据 就应该有个地方能够存储
我们只需要执行数据库迁移命令即可 django会自动创建很多需要的表
ps:django默认的session失效时间是14天
设置session的代码:
request.session['key'] = value
当我们在设置session的时候会执行下列操作:
- 1.生成一个随机字符串
- 2.对value数据做加密处理 并在django_session表中存储
随机字符串>>>加密数据 - 3.将随机字符串也发送一份给客户端保存(cookie)
sessionid:随机字符串
获取session的代码
request.session.get('key')
在获取session的时候会执行下列操作
- 1.自动获取随机字符串
- 2.去django_session表中根据随机字符串获取加密的数据
- 3.自动解密数据并处理到request.sesion.get()中
总结和补充
总结
通过上面的知识点讲解我们可以发现session的使用非常简单,但是在底层来看,其实代码执行了非常多的操作,今后我们写代码也应该朝这方面靠拢.
补充说明
当我们在执行代码进行实操的时候会遇到一些问题
设置session中的注意事项
def set_session(request):
request.session['name'] = 'Like' # 设置Session
return HttpResponse('设置Session')
'''
第一次运行的时候访问接口会发生报错 no such table: django_session
因为当客户端登录成功之后 服务端会产生一个随机字符串 返回客户端去保存(之所以要保存就是因为我们只有保存了这个字符串对应的信息,才能去进行信息校对,否则前端发送cookie我们无法识别)
服务端会针对这些字符串跟对应用户信息做一个保存 这个关系就保存在服务端执行迁移命令里面的Django_session表里面(但是目前我们第一次跑程序还没执行迁移命令)
表里面有三个字段 Session_key Session_data Expire_date
session_ky 随机产生的一个加密字符串令牌
session_data session数据
expire——date django默认的session失效时间14天(不登录)
这个时候迁移命令创建完之后就可以访问接口了
'''
迁移操作截图
获取session中的注意事项
def get_session(request): # 获取session
print(request.session.get('name'))
return HttpResponse('获取Session') # 自动会加密解密
'''
request.session['name'] = 'Like'
1.django自动产生一个随机字符串返回给客户端(对name加密)
2.往django_session创建数据(对jason加密)
request.session.get('name')
1.自动从请求中获取sessionid对应的随机字符串
2.拿着随机字符串去django_session中匹配数据
3.如果匹配上还会自动解密数据并展示
'''
其他注意事项
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' # 引擎
其他公用设置项:
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_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
session其他操作
'''
删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
'''