首页 > 其他分享 >django中间件了解的三个方法、基于Django的插拔式设计、cookie与session简介、基于Django的cookie与session用户登入

django中间件了解的三个方法、基于Django的插拔式设计、cookie与session简介、基于Django的cookie与session用户登入

时间:2022-12-24 16:22:19浏览次数:48  
标签:用户 Django session cookie 登入 字符串

目录

Django中间件三个了解的方法

1.process_view

路由匹配成功之后执行的视图函数/类之前自动触发(顺序同process_exception)

image

注册别忘了
image

如下process_view的执行顺序

触发:在路由匹配成功之后执行视图函数/类之前自动触发

image

2.process_exception

视图函数/类执行报错自动触发(顺序同process_response)

exceptio关键字主要是跟异常相关的

image

当你在执行视图函数/类报错之后自动触发

image

3.process_template_response

​ 视图函数/类返回的HttpResponse对象含有render并且对应一个方法的时候自动触发(顺序同process_response)

image

基于Django中间实现功能的插拔式设计

将各个功能制作成配置文件的字符串形式 
    如果想拥有该功能就编写对应的字符串
    如果不想有该功能则注释点对应的字符串
    
如何利用字符串导入模块?
import importlib
s1 = 'bbb.b'  # aaa.bbb.ccc.b
res = importlib.import_module(s1)  # from aaa.bbb.ccc import b
print(res)  # <module 'bbb.b' from 'D:\\pythonProject03\\djangomiddle\\bbb\\b.py'>
'''注意字符串的结尾最小单位只能是py文件 不能是py文件里面的变量名'''

Django的settings文件里好多都是字符串 但是呢都是不简单的字符串

每一个字符串对应着一个py文件就代表着一个特定的功能

如果你想这个字符串有这个功能就加上 不想用就直接注释点

那么如何利用字符串导模块?

在纯python情况下

image

利用字符串导模块 内置模块importlib

image

如图:

image

按照点号从右开始切割一个 它的底层还是按照from导模块的句式

image

局限性这个模块的最小单位是py文件名 不能到py文件里的变量名

image

需求分析:

模拟编写一个消息通知功能(微信、qq、邮箱)

通过一点击一个按钮就能触发送消息

方式一:简单版 基于函数封装

image

方式二:基于Django中间件的功能设计

基于Django中间件 模拟Django中间件差不多的形式表现的

image

但最有一个拿到的都是类名 可importlib模块的最小单位都是py文件名 这怎么搞呢?

start启动文件里面要用到notify包下所有的消息通知组件

那么导notify导的就是包里面的双下init.py

image

都添加到双下init.py中统一资源管理

导入配置文件settings.py 从右开始切割一次拿到就是字符串的py名文件路径 以及字符串的类名

image

再到启动文件中 如图:

image

那么怎样利用字符串去对象里拿一个名字呢?

想字符串、对象 >>> 想到就有反射:根据字符串获取对象对应的属性名(值)或方法名(函数体代码)

image

拿到类名加括号产生对象

对象点发送消息的方法

image

如图:

image

就实现跟Django中间件一样了 用你就写上 不用你注释掉

image

添加后注册

image

这样就实现了功能的插拔设计

总结:

利用到了内置模块importlib通过字符串导入模块、

以及rsplit从右开始max最大切割一次、

及反射getattr将模块名看成是对象再通过反射回去到对应模块中的字符串所对应的名字、

以及面向对象中的多态性当在使用面向对象的代码时在编写功能业务差不的代码时把他们的方法定义成相同的名字比较方便合理

cookie与session简介

"""
回忆:HTTP协议四大特性
	1.基于请求响应	
	2.基于TCP、IP作用于应用层之上的协议
	3.无状态
		不保存客户端的状态
	4.无连接
"""
最开始的网站都不需要用户注册 所有人来访问获取到的数据都是一样的
随着互联网的发展很多网站需要指定当前用户的状态

早期客户端:

当你是一次输入用户名和密码时 浏览器(客户端)会有能力记住和保存起来你登入各个网站的用户名和密码 再次访问的时候浏览器帮你发送了你的用户名和密码

这种是直接保存在客户端安全性会非常的低 就比如当你去网吧上网登入微信 QQ假如电脑没有初始化重启 其他人来上网就能看到

随着互联网的发展很多网站需要指定当前用户的状态:

当你第一次输入用户名和密码之后 服务端会给你返回一个随机字符串

浏览器拿着个随机字符串 以后再访问这个服务端 把字符串给到服务端 服务端内部是用户信息对应好了的 哪个用户对应的哪个随机字符串 这样就能够知道你是谁 这样用户数据就保存在服务端了 而浏览器只保存了随机字符串 这样用户信息就在客户端查看不了

session的工作是得依赖cookie

将cookie记录清除 如图:

image

再登入 发现比未登入前多 而这些多出来的就是对身份的唯一标识

image

小知识拓展:

浏览器上是有拒绝保存cookie的 如果勾选上的话所有的登入页面功能都登入不上全部失效

image

因为所有的登入功能在输对用户名和密码之后都得在浏览器上保存一个随机字符串 而现在本地是没有保存随机字符串的功能了 那么服务端想给你发随机字符串却保存不了

这样每一次在登入请求时都得自己输用户名和密码 可却又去无法保存服务端发送过来的随机字符串 这样一来所有的登入功能都实现不了

总结:

cookie:保存在客户端与用户状态相关的信息

session:保存在服务端与用户状态相关的信息

session的工作需要依赖于cookie

基于Django cookie与session的用户登入功能

Django操作cookie

from django.shortcuts import render,HttpResponse,redirect
return render()
return HttpResponse()
return redirect()

要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收
obj1 = render()
return obj1
obj2 = HttpResponse()
return obj2
obj3 = redirect()
return obj3

如图,编写一个只用用户登入之后才能看的视图函数

image

但是现在这样的话只有用户登入才能看的页面是无法实现的 ,因为用户在登入之后没有保存用户是否已登入的状态

那么如图:

要想操作cookie就不能直接返回HttpResponse对象,必须先用变量接收

image

这样就无法直接访问home视图函数

image

只有用户登入之后才可以随意访问home,这样浏览器就保存了cookie信息为键是name、值是当前登入的用户名

image

需求:

需要用户登入之后访问的页面有好几个

image

以上的视图函数都需要登入之后才能看

那又假如我有三百个这个视图函数 都加一个校验用户是否登入的功能 而一个个加完时老板又说把30个校验用户登入的功能去掉 这不就裂开了嘛!

image

那么就要频繁的去操作上面的代码

这时想到针对有些函数想给它功能又不想给他加功能有时能加有时候不能加 >>> 装饰器

装饰器在不改变被装饰对象原代码及调用方式的情况下 添加的新功能

这样被装饰的对象就简易了 只需要写它的主体功能就可以了

image

进阶操作:用户没有登入之前想访问某个网站输入用户名密码之后就应该跳回该网站去

 # print(request.path)  # 只获取用户输入的路由信息
 # print(request.path_info)  # 只获取用户输入的路由信息
# print(request.get_full_path())  # 获取用户输入的路由信息+问号后面携带的数据

image

如图前两个都是获取用户输入的路由信息 第三个是获取用户输入的路由的信息+问号后面携带的数据

如图:

image

这样就能够拿到用户想要访问路由网址

image

想要访问home1 后面自动加上home1

image

这样一来在用户没有登入用户名和密码的情况下 就可以拿到用户需要访问的路由

还得要加判断 假如用户直接输入的就是登入页面那么就直接跳到登入的首页去

image

总结:

装饰器是把用户登入成功之后的视图函数都装上了

那么用户在没有登入的情况下 就能够拿到用户想要访问的那个路由 但是必须得要先登入

因为只有在执行完登入功能之后才能正真的跳转到一个页面去

那么在跳转到登入功能之前把用户正真想访问的路由塞给登入的这个路由里

这样在登入完之后就可以在request.GET.get拿到用户在登入之前想访问的地址

Django操作session

由于session是保存在服务端上面的数据 就应该有个地方能够存储
我们只需要执行数据库迁移命令即可 django会自动创建很多需要的表


django默认的session失效时间是14天


设置session	
	request.session['key'] = value
        1.生成一个随机字符串
        2.对value数据做加密处理 并在django_session表中存储
            随机字符串>>>加密数据
        3.将随机字符串也发送一份给客户端保存(cookie)
            sessionid:随机字符串
获取session	
	request.session.get('key')
        1.自动获取随机字符串
        2.去django_session表中根据随机字符串获取加密的数据
        3.自动解密数据并处理到request.sesion.get()中
    
补充说明
	1.可以设置过期时间		
 	2.存储session数据的位置也可以修改

设置session

如图

image

直接访问该视图函数会直接报错

由于session是保存在服务端上面的数据 就应该有地方存储

image

但是呢其实存储位置不需要我们去创键

Django只需要在执行了数据迁移命令之后就会自动生成它所需要的表

如图就是为啥一开始我们创建表的时候会生成好多我们不知道的表的原因

image

执行完迁移命令以后有了Django.session表再访问就不报错了

image

Django.session表中都是经过加密之后产生的的随机字符串 目的是为了提升安全性

image

过期时间 如,我们登入的一些网站时是有时效性的 隔了好久没登就得要重新登入 失效时间默认14天

如图现实的是:UTC时间 加8小时 才是我们这里的时间

image

获取session表里面的数据

image

底层原理:

自动获取到随机字符串 去Django表中获取随机字符串加密的数据再自动解密处理到request.session.get()中

结果:

image

补充说明

设置过期时间

单位是秒

image

3秒 要换天数就得要有秒数转换

image

3秒过期了 再去session表里拿数据就不到了

image

存储session数据的位置可以修改

可以规定存在表里还是文件里或者缓存数据库里都可以

标签:用户,Django,session,cookie,登入,字符串
From: https://www.cnblogs.com/xiao-fu-zi/p/17002992.html

相关文章