其他分享
首页 > 其他分享> > cookie、session与中间件

cookie、session与中间件

作者:互联网

cookie与session

cookie与session简介

'''
HTTP协议
1.基于请求响应
2.基于TCP\IP之上作用于应用层的协议
3.无状态
不保存请求和响应之间的通信状态
4.无/短连接
请求一次处理一次,之后断开
'''
1.Cookie
1.1因为HTTP协议是无状态的,所有每次请求都是独立的,执行后不会保存请求和响应之间的通信状态,而Cookie可以在客户端保存跟用户信息(状态)相关的数据
1.2当你第一次登录成功之后,客户端会自动将用户信息保存到本地,当你在次访问服务端是,客户端就会带着你的用户信息去帮你验证

2.Session
1.1Session与Cookie类似,当他会将用户信息(状态)相关的数据保存到服务端
1.2当你第一次登录成功之后,服务端返回数据之后,用户端不会保存你的用户信息,而是在服务端产生一个随机字符串(令牌),任何让客户端保存这个令牌,在服务端中有所有令牌对应的用户信息,当再次服务服务端时,服务端就可以通过令牌来获取对应的用户信息
'''
session的工作需要依赖于cookie,目前所有的识别用户身份的网址都需要使用cookie
用户端直接报错用户数据,容易泄露
Session的令牌如果被获取,则可以冒充该用户信息
互联网没有绝对的安全,只有更安全
'''

django操控cookie

1.让客户端浏览器保存cookie需要HttpResonse对象调用方法
return HttpResponse()
return render()
return redirect()
return JsonRepsonse()

2.设置cookie
obj = HttpResponse()
obj.操作cookie的方法
return obj

2.使用cookie校验是否登录
2.1多个视图函数都需要校验用户是否登录>>>装饰器
2.2记住用户登录之前想要访问的页面,登录成功之后自动跳转
场景1:用户访问了其他需要登录才可以访问的页面>>>跳转想要访问的页面
场景2:用户没有想访问的页面>>>直接跳转首页
2.3三种获取访问网址后缀的方法
print(request.path)
# /login/
print(request.path_info)
# /login/
print(request.get_full_path())
# /login/?name=barry&pwd=123

3.登录实例
def login_auth(func):
    # 装饰器单独接收request
    def inner(request, *args, **kwargs):
        # 判断是否登录
        if request.COOKIES.get('name'):
            res = func(request, *args, **kwargs)
            return res
        else:
            # 获取跳转到登录页面前想要访问的页面
            target_path = request.path_info
            # 跳转到登录页面
            return redirect(f'/login/?next={target_path}')
    return inner


def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'barry' and password == '123':
            # 获取登录前想要访问的页面
            target_path = request.GET.get('next')
            # 判断是否有需要登录后跳转的页面
            if target_path:
                obj = redirect(target_path)
            else:
                # 如果没有值则跳转到首页
                obj = redirect('/home/')
            # 让浏览器保存cookie数据
            obj.set_cookie('name', 'barry')
            return obj
    return render(request, 'abform.html')


@login_auth
def home(request):
    return HttpResponse('home页面 登录用户才能访问')


@login_auth
def index(request):
    return HttpResponse('index页面 登录用户才能访问')

django操控session

1.当客户端登录成功之后,服务端产生一个随机字符串返回给客户端保存,服务端存储随机字符串与用户信息的对应关系,之后客户端携带随机字符串到服务端字段效验
所以要创建djang_session表存储用户相关数据
'''
1.django默认的session失效时间14天
2.客户端会接收到键值对,键默认是sessionid,值是加密的随机字符串(令牌)
'''

2.request.session['name'] = 'barry'
2.1django自动产生一个随机字符串返回给客户端(对name加密)
2.2在django_session创建创建数据(对barry加密)

3.request.session.get('name')
3.1自动从请求中获取sessionid对应的随机字符串
3.2拿着获取的随机字符串取django_session中匹配数据
3.2如果匹配上了会自动解密数据并展示

4.session的存储位置有五种模式
数据库、缓存数据库、文件、缓存+数据库、加密

5.request.session.delete()
删除当前会话的所有Session数据


6.request.session.flush() 
删除当前的会话数据并删除会话的Cookie。

7.request.session.set_expiry(value)
设置会话Session和Cookie的超时时间
7.1如果value是个整数,session会在些秒数后失效
7.2如果value是个datatime(日期时间)或timedelta(时间差),session就会在这个时间后失效
7.3如果value是0,用户关闭浏览器session就会失效
7.4如果value是None,session会依赖全局session失效策略

中间件

django中间件介绍

1.django中间件类似于django的门户,在视图函数执行之前和执行之后都可以做一些额外操作,所有请求和响应都必须经过中间件

2.django默认自带七个中间件,每个中间件都有各自负责的功能,除了默认的中间件之外,还支持自定义中间件(无限)

3.django使用场景
全局用户是否校验、全局用户黑名单校验、全局用户访问频率校验

django中间件的方法

1..django自定义的中间件其实是类,可以写五个方法
process_request
prcoess_response
prcoess_view
prcoess_template_response
process_exception

2.process_request
2.1请求来的时候会按照配置(MIDDLEWARE)文件中注册了的中间件,从上往下依次经过每一个中间件里面的process_request方法,如果没有则直接跳过
2.2该方法如果返回了HttpResonse对象,则代表这个请求不符合规范,那么请求不会在往后执行,直接原路返回

3.prcoess_response
3.1响应走的时候会按照配置文件中注册了的中间件,从下往上依次执行每一个中间件里面的prcoess_response方法,如果没有则直接跳过
3.2该方法有两个形参request和response,并且默认情况下应该返回response
3.2改方法也可以返回HttpResponse对象,但这样就会将原本返回的数据拦截了,将HttpResponse对象的数据返回回去
'如果请求过程中process_request方法直接返回了HttpResponse对象那么会原地执行同级别process_response方法返回(flask则不同),不会按顺序继续依次执行'

4.process_view(self, request, view_func, view_args, view_kwargs)
4.1该方法有四个参数
request是HttpRequest对象
view_func是Django即将使用的视图函数(它是实际的函数对象,而不是函数的名称作为字符串)
view_args是将传递给视图的位置参数的列表
view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(equest)
4.2当路由匹配成功之后,执行视图函数之前,自动触发,

5.process_exception(self, request, exception)
5.1该方法两个参数:
一个HttpRequest对象
一个exception是视图函数异常产生的Exception对象
5.2函数报错之后,执行触发

6.process_template_response(self, request, response)
6.1该方法两个参数:
一个HttpRequest对象
response是TemplateResponse对象(视图函数或者中间件产生)
6.2函数返回的数据对象中含有render属性对应render函数才会触发

标签:return,request,中间件,django,session,cookie
来源: https://www.cnblogs.com/riuqi/p/16686689.html