目录
Django中间件三个了解的方法
1.process_view
路由匹配成功之后执行的视图函数/类之前自动触发(顺序同process_exception)
注册别忘了
如下process_view的执行顺序
触发:在路由匹配成功之后执行视图函数/类之前自动触发
2.process_exception
视图函数/类执行报错自动触发(顺序同process_response)
exceptio关键字主要是跟异常相关的
当你在执行视图函数/类报错之后自动触发
3.process_template_response
视图函数/类返回的HttpResponse对象含有render并且对应一个方法的时候自动触发(顺序同process_response)
基于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情况下
利用字符串导模块 内置模块importlib
如图:
按照点号从右开始切割一个 它的底层还是按照from导模块的句式
局限性这个模块的最小单位是py文件名 不能到py文件里的变量名
需求分析:
模拟编写一个消息通知功能(微信、qq、邮箱)
通过一点击一个按钮就能触发送消息
方式一:简单版 基于函数封装
方式二:基于Django中间件的功能设计
基于Django中间件 模拟Django中间件差不多的形式表现的
但最有一个拿到的都是类名 可importlib模块的最小单位都是py文件名 这怎么搞呢?
start启动文件里面要用到notify包下所有的消息通知组件
那么导notify导的就是包里面的双下init.py
都添加到双下init.py中统一资源管理
导入配置文件settings.py 从右开始切割一次拿到就是字符串的py名文件路径 以及字符串的类名
再到启动文件中 如图:
那么怎样利用字符串去对象里拿一个名字呢?
想字符串、对象 >>> 想到就有反射:根据字符串获取对象对应的属性名(值)或方法名(函数体代码)
拿到类名加括号产生对象
对象点发送消息的方法
如图:
就实现跟Django中间件一样了 用你就写上 不用你注释掉
添加后注册
这样就实现了功能的插拔设计
总结:
利用到了内置模块importlib通过字符串导入模块、
以及rsplit从右开始max最大切割一次、
及反射getattr将模块名看成是对象再通过反射回去到对应模块中的字符串所对应的名字、
以及面向对象中的多态性当在使用面向对象的代码时在编写功能业务差不的代码时把他们的方法定义成相同的名字比较方便合理
cookie与session简介
"""
回忆:HTTP协议四大特性
1.基于请求响应
2.基于TCP、IP作用于应用层之上的协议
3.无状态
不保存客户端的状态
4.无连接
"""
最开始的网站都不需要用户注册 所有人来访问获取到的数据都是一样的
随着互联网的发展很多网站需要指定当前用户的状态
早期客户端:
当你是一次输入用户名和密码时 浏览器(客户端)会有能力记住和保存起来你登入各个网站的用户名和密码 再次访问的时候浏览器帮你发送了你的用户名和密码
这种是直接保存在客户端安全性会非常的低 就比如当你去网吧上网登入微信 QQ假如电脑没有初始化重启 其他人来上网就能看到
随着互联网的发展很多网站需要指定当前用户的状态:
当你第一次输入用户名和密码之后 服务端会给你返回一个随机字符串
浏览器拿着个随机字符串 以后再访问这个服务端 把字符串给到服务端 服务端内部是用户信息对应好了的 哪个用户对应的哪个随机字符串 这样就能够知道你是谁 这样用户数据就保存在服务端了 而浏览器只保存了随机字符串 这样用户信息就在客户端查看不了
session的工作是得依赖cookie
将cookie记录清除 如图:
再登入 发现比未登入前多 而这些多出来的就是对身份的唯一标识
小知识拓展:
浏览器上是有拒绝保存cookie的 如果勾选上的话所有的登入页面功能都登入不上全部失效
因为所有的登入功能在输对用户名和密码之后都得在浏览器上保存一个随机字符串 而现在本地是没有保存随机字符串的功能了 那么服务端想给你发随机字符串却保存不了
这样每一次在登入请求时都得自己输用户名和密码 可却又去无法保存服务端发送过来的随机字符串 这样一来所有的登入功能都实现不了
总结:
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
如图,编写一个只用用户登入之后才能看的视图函数
但是现在这样的话只有用户登入才能看的页面是无法实现的 ,因为用户在登入之后没有保存用户是否已登入的状态
那么如图:
要想操作cookie就不能直接返回HttpResponse对象,必须先用变量接收
这样就无法直接访问home视图函数
只有用户登入之后才可以随意访问home,这样浏览器就保存了cookie信息为键是name、值是当前登入的用户名
需求:
需要用户登入之后访问的页面有好几个
以上的视图函数都需要登入之后才能看
那又假如我有三百个这个视图函数 都加一个校验用户是否登入的功能 而一个个加完时老板又说把30个校验用户登入的功能去掉 这不就裂开了嘛!
那么就要频繁的去操作上面的代码
这时想到针对有些函数想给它功能又不想给他加功能有时能加有时候不能加 >>> 装饰器
装饰器在不改变被装饰对象原代码及调用方式的情况下 添加的新功能
这样被装饰的对象就简易了 只需要写它的主体功能就可以了
进阶操作:用户没有登入之前想访问某个网站输入用户名密码之后就应该跳回该网站去
# print(request.path) # 只获取用户输入的路由信息
# print(request.path_info) # 只获取用户输入的路由信息
# print(request.get_full_path()) # 获取用户输入的路由信息+问号后面携带的数据
如图前两个都是获取用户输入的路由信息 第三个是获取用户输入的路由的信息+问号后面携带的数据
如图:
这样就能够拿到用户想要访问路由网址
想要访问home1 后面自动加上home1
这样一来在用户没有登入用户名和密码的情况下 就可以拿到用户需要访问的路由
还得要加判断 假如用户直接输入的就是登入页面那么就直接跳到登入的首页去
总结:
装饰器是把用户登入成功之后的视图函数都装上了
那么用户在没有登入的情况下 就能够拿到用户想要访问的那个路由 但是必须得要先登入
因为只有在执行完登入功能之后才能正真的跳转到一个页面去
那么在跳转到登入功能之前把用户正真想访问的路由塞给登入的这个路由里
这样在登入完之后就可以在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
如图
直接访问该视图函数会直接报错
由于session是保存在服务端上面的数据 就应该有地方存储
但是呢其实存储位置不需要我们去创键
Django只需要在执行了数据迁移命令之后就会自动生成它所需要的表
如图就是为啥一开始我们创建表的时候会生成好多我们不知道的表的原因
执行完迁移命令以后有了Django.session表再访问就不报错了
Django.session表中都是经过加密之后产生的的随机字符串 目的是为了提升安全性
过期时间 如,我们登入的一些网站时是有时效性的 隔了好久没登就得要重新登入 失效时间默认14天
如图现实的是:UTC时间 加8小时 才是我们这里的时间
获取session表里面的数据
底层原理:
自动获取到随机字符串 去Django表中获取随机字符串加密的数据再自动解密处理到request.session.get()中
结果:
补充说明
设置过期时间
单位是秒
3秒 要换天数就得要有秒数转换
3秒过期了 再去session表里拿数据就不到了
存储session数据的位置可以修改
可以规定存在表里还是文件里或者缓存数据库里都可以
标签:用户,Django,session,cookie,登入,字符串 From: https://www.cnblogs.com/xiao-fu-zi/p/17002992.html