ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cookie、session与中间件

2022-09-12 17:34:13  阅读:330  来源: 互联网

标签:return request 中间件 django session cookie


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有