HTTP协议四大特性
基于请求响应
基于TCP、IP作用于应用层上协议
无状态 服务端 不记录客户端的连接
服务端无法识别客户端的状态
互联网刚开始兴起的时候 所有人访问网址都是一样的数据
服务端 无法识别客户端问题不大
互联网发展 淘宝、京东、阿里
服务端不得不想办法记住客户端的状态
cookie与session应运而生
Cookie
保存在客户端上用户信息(状态)相关的数据
Session
保存在服务端上用户信息(状态)相关的数据
session的工作需要依赖于cookie 就算是目前所有能够识别用户身份的网址也都需要使用cooie(客户端浏览器也有权限拒绝保存cookie)
如果想要让客户端浏览器保存ciookie 需要HttpResonse对象调用方法
return HttpResponse()
return render()
return redirect()
return JsonRepsonse()
设置cookie 需要变形
obj = HttpResponse()
obj.操作cookie的方法
return obj
obj = render()
obj.操作cookie的方法
return obj
obj = redirect()
obj.操作cookie的方法
return obj
obj = JsonRepsonse()
obj.操作cookie的方法
return obj
多个视图函数都需要校验用户是否登录
装饰器
如何记住用户登录之前想要访问的页面 用户登录成功之后自动跳转
获取网页地址后缀的方式
request.path # 获取后缀 request.path_info # 获取后缀 request.get_full_path # 将 后缀 后问号后面的 地址也能获取到
- 1
- 2
- 3
分两种可能场景
用户访问了其他需要登录才可以访问的页面
登录成功后直接跳转至该页面
通过 装饰器在校验cookie判断 没有登录时 将现在访问的网页地址后缀获取 存到地址后面
在登录 成功后 将地址后面的取出 之前需要访问地址 直接 跳转
用户直接访问登录页面
登录成功后直接跳转至 主页
def login_user(funce):
def inner(*args,**kwargs):
if args[0].COOKIES.get('name'):
res = funce(*args,**kwargs)
return res
else:
target_path=args[0].path_info
return redirect(f'/login/?next={target_path}')
return inner
def login(request):
if request.method=='POST':
username = request.POST.get('name')
password = request.POST.get('pwd')
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','jasonNB')
return obj
return render(request,'login.html')
@login_user
def home(request):
# if request.COOKIES.get('name'):
return HttpResponse('home页面')
# return redirect('/login/')
@login_user
def index(request):
# if request.COOKIES.get('name'):
return HttpResponse('index页面 只有登录的用户 才可以查看')
# return redirect('/login/')
请求来之后服务端产生随机字符串 并发送给客户端保存 服务端存储随机字符串 与用户信息对应关系 之后客户端携带随机字符串 服务端自动校验
django默认的session失效时间14天
客户端会接收到键值对 键默认是sessionid值 是加密的随机字符串(令牌)
request.session['name'] = 'jason'
- 1
django会自动产生一个字符串返回给客户端(并且对name加密)
往django_session中匹配数据
如果匹配上还会自动解密数据并展示
request.session.get('name')
- 1
自动从请求中回去sessionid对应的随机字符串
拿着随机字符串去django_session中匹配数据
如果匹配上还会自动解密数据并展示
session的存储位置 可以有五种模式
删除当前会话的所有Session数据
request.session.delete()
删除当前会话数据并删除会话的Cookie
request.session.flush()
设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
datatime 或timedelta,session就会在这个时间后失效django种间件类似于django的门户 所有的请求来和响应走都必须经过中间件
django默认自带七个中间件 每个中间件都有各自负责的功能
django中间件除了默认的之外 还支持自定义中间件(无限)
django中间件使用场景
全局相关使用场景:
全局用户身份校验 全局用户黑名单校验 全局用户访问频率校验
django自定义中间件中可以有五个方法:
process_requestprocess_responseprocess_viewprocess_template_responseprocess_exceptionprocess_request
process_request方法 如果没有则直接跳过HttpResonse对象 那么请求不会再往下执行 而是原路返回process_response
响应走的时候会按照配置文件中注册了的中间件 从下往上依次执行每一个中间件里面的process_response方法 没有没有则直接跳过
该方法有两个形参request和response并且默认情况下应该返回response
该方法也可以自己返回HttpResponse对象 相当于狸猫换太子
注意:如果请求的过程中 process_request方法直接返回了HttpRecsponse对象 anemic会原地执行同级别(即当前行的)process_response方法
process_view
当路由匹配成功之后 执行视图函数之前 自动触发
# 即将执行的视图函数的 名字、位置参数、关键字参数
def process_view(self,request,view_func,view_args,view_kwargs):
process_excption
当视图函数报错之后 自动触发
process_template_response
当视图函数返回的数据对象中含有render 属性对应 render函数才会触发
首先 可以通过查看django自带的中间件查看中间件定义的规律
导入 MiddlewareMixin 创建类继承 MiddlewareMixin
from django.utils.deprecation import MiddlewareMixin
class MyMdd1(MiddlewareMixin):
def process_request(self,request):
print('MyMdd1 process_request')
# return HttpResponse('回去吧')
def process_response(self,request,response):
print('MyMdd1 process_response')
return response
def process_view(self,request,view_func,view_args,view_kwargs):
print('MyMd1 process_view')
在类中 直接创建中间件方法 配上对应的形参即可
再到配置文件settings.py中 依次写上创建好的中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
#自定义的中间件
'app01.utils.mymdd.MyMdd2',
'app01.utils.mymdd.MyMdd1',
]