#内容概览
- cookie与session简介
- Django操作cookie
- Django操作session
- Django中间件
cookie与session简介
HTTP协议四大特性:
- 基于请求响应
- 基于TCP/IP作用于应用层之上协议
- 无状态
- 无连接
随着互联网的发展,服务端需要记录客户端的状态,针对无状态的特性,就有了cookie与session cookie:保存在客户端上与用户信息相关的数据 session:保存在服务端上与用户信息相关的数据 ps:session的工作也需要cookie,目前所有能够识别用户身份的网址都使用到了cookie(客户端浏览器也可以拒绝保存cookie)
Django操作cookie
"""如果想要让客户端浏览器保存cookie,需要使用HttpResponse对象调用方法"""
def func01(request):
obj = HttpResponse()
obj.cookie方法
return obj
"""render/redirect/JsonResponse等创建的对象都算是HttpResponse对象"""
"""删除cookie"""
def func01(request):
obj = HttoResponse()
obj.delete_cookie('name')
return obj
"""cookie参数"""
key 键
value 值
max_age cookie最大生效时限
expires 同上,针对IE浏览器
path cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
domain cookie生效的域名
secure https传输
httponly 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
"""使用户在登录时使用cookie记录"""
def func01(request):
obj = render(request, 'func01.html')
if request.method == "POST":
name = request.POST.get('username')
obj.set_cookie('name', name)
return obj
return obj
"""设置页面需要登录后才能够访问"""
def func02(request):
if request.COOKIES.get('name'):
return render(request, 'func02.html')
return redirect('/func01/')
func01.html:
<form action="" method="post">
<p><input type="text" name="username" placeholder="username"></p>
<p><input type="password" name="password" placeholder="password"></p>
<input type="submit" value="提交">
</form>
"""多个函数都需要在使用校验校验用户身份,那么就该使用到装饰器了"""
def login(func_name):
def inner(request, *args, **kwargs):
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
else:
return redirect('/func01/')
return inner
@login
def func03(request):
return render(request, 'func03.html')
- 让服务端记住用户登录前想访问的页面,登录成功后自动跳转
想要能够跳转到用户之前想访问的页面首先需要获取用户想要访问页面的路由 request.path request.path_info request.get_full_path 一二都是只获取路由,第三个会获取包括问号后的所有数据
"""装饰器"""
def login(func_name):
def inner(request, *args, **kwargs):
if request.COOKIES.get('name'):
res = func_name(request, *args, **kwargs)
return res
else:
i_path = request.path_info
return redirect(f'/func01/?i_path={i_path}')
return inner
"""登录函数"""
def func01(request):
obj = render(request, 'func01.html')
if request.method == "POST":
i_path = request.GET.get('i_path')
if i_path:
obj = redirect(i_path)
else:
obj = redirect('home.html')
name = request.POST.get('username')
obj.set_cookie('name', name)
return obj
return obj
Django操作session
cookie通过每次访问自动发送数据算是解决了保存状态的需求,但是由于cookie本身最大只支持4096字节,以及数据存放在客户端,可能被拦截窃取安全性不高;所以就需要使用能够支持更多字节,并且保存在服务器使安全性更高的session session在请求来之后服务端产生随机字符串发送给客户端,服务端只需要保存随机字符串与用户信息之间的关系;之后客户端只需要使用随机字符串发送给服务端校验即可
"""
django默认的session失效时间为14天
客户端收到的键值对,键默认是sessionid,值是加密的字符串
"""
request.session['name'] = 'jason'
"""
django自动产生一个随机字符串返回给客户端(对name加密)
往django_session.创建数据(对jason加密,新项目需要先执行数据库迁移命令,否则没有表存放数据)
"""
request.session.get('name')
"""
自动从请求中获取sessionid对应的随机字符串
拿着随机字符串去django_session中匹配数据
匹配成功会将数据解密当做返回值返回
"""
"""session其他操作"""
1. 删除当前会话的所有session数据
request.session.delete()
2. 删除当前会话数据并删除会话的cookie
request.session.flush()
3. 设置会话session和cookie的失效时间
request.session.set_expiry()
session的存储位置可以有五种模式
4. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
5. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'
6. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
SESSION_FILE_PATH = None
7. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
8. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
其他公用设置项:
SESSION_COOKIE_NAME = "sessionid"
SESSION_COOKIE_PATH = "/"
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_SECURE = False
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_AGE = 1209600
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_SAVE_EVERY_REQUEST = False
Django中间件
所有请求与响应都必须经过中间件,django默认自带七个中间件,每个都负责各自的功能 setting中自带的中间件:
django除了有默认的中间件,还支持自定义中间件 django自定义中间件中有五个方法: process_request、process_response、process_view、process_template_response、process_exception
1.process_request
1.请求来的时候会按照配置文件中注册了的中间件 从上往下依次执行每一个中间件里面的process_request方法 如果没有则直接跳过
2.该方法如果返回了HttpResonse对象 那么请求不会再往后执行 原路返回
2.process_response
1.响应走的时候会按照配置文件中注册了的中间件 从下往上一次执行每一个中间件里面的process_response方法 没有没有则直接跳过
2.该方法有两个形参request和response 并且默认情况下应该返回response
3.该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
ps:如果请求的过程中process_request方法直接反悔了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同)
3.process_view
当路由匹配成功之后 执行视图函数之前 自动触发
4.process_excption
当视图函数报错之后 自动触发
5.process_template_response
当视图函数返回的数据对象中含有render属性对应render函数才会触发
|