Django框架——cookie与session简介、django操作cookie与session、django中间件
cookie与session简介
"""
回忆:HTTP协议四大特性
1.基于请求响应
2.基于TCP、IP作用于应用层之上的协议
3.无状态
不保存客户端的状态
4.无连接
"""
最开始的网站都不需要用户注册 所有人来访问获取到的数据都是一样的
随着互联网的发展很多网站需要指定当前用户的状态
cookie
保存在客户端与用户状态相关的信息
session
保存在服务端与用户状态相关的信息
ps:session的工作需要依赖于cookie
补充:浏览器有资格拒绝保存服务端发送过来的cookie数据
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
'''编写一个真正的用户登录功能'''
def login_func(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
obj = redirect('/home/')
obj.set_cookie('name',username)
return obj
return render(request,'loginPage.html')
### 装饰器
def login_auth(func_name):
def inner(request,*args,**kwargs):
if request.COOKIES.get('name'):
res = func_name(request,*args,**kwargs)
return res
else:
return redirect('/login/')
return inner
@login_auth
def home_func(request):
return HttpResponse('home页面 只有登录的用户才可以查看')
'''进阶操作:用户没有登录之前想访问某个网站输入用户名密码之后就应该调回改网站'''
def login_func(request):
if request.method == 'POST':
username == resquest.POST.get('username')
password == resquest.POST.get('password')
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',username)
return obj
return render(request,'loginPage.html')
def login_auth(func_name):
def inner(request,*args,**kwargs):
target_path = request.path_info # 只获取用户输入的路由信息
if request.COOKIES.get('name'):
res = func_name(request,*args,**kwargs)
return res
else:
return redirect('/login/?next=%s' % target_path)
return inner
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.session.get()中
补充说明
1.可以设置过期时间 # request.session.set_expiry(5) # 默认是秒为单位
2.存储session数据的位置也可以修改
'''代码演示'''
def set_se_func(request):
# 会自动转换成字符串的形式存储在表中
request.session['desc'] = '时间过的真快 又要干饭了 还是疯狂星期四!!'
# 设置过期时间
request.session.set_expiry(5) # 默认是秒为单位
return HttpResponse('稍微屯点吃的')
def get_se_func(request):
# 存储在表中的数据会自动解密到session.get中
print(request.session.get('desc'))
return HttpResponse('再坚持一会会')
django中间件
django默认有七个中间件 并且还支持用户自定义中间件
中间件主要可以用于:网站访问频率的校验 用户权限的校验等全局类型的功能需求
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',
]
如何自定义中间件
1. 在项目名下或者应用名下新建一个任意名称的文件夹
2. 在这个文件夹下面新建一个py文件
3. 在这个py文件中,新建一个类,必须继承MiddlewareMixin
4. 在你新建的这个类下面可以写哪几个方法:
process_reqeust # 需要传request参数
process_response # 需要传request和response参数
process_view
process_exception
process_template_response
5. 一定要在配置文件的中间件里面注册你的中间件路径
from django.utils.deprecation import MiddlewareMixin
class MyMiddleware001(MiddlewareMixin):
def process_request(self,request):
print('from MyMiddleware001 process_request')
def process_response(self,request,response):
print('from MyMiddleware001 process_response')
return response
在类中编写五个可以自定义的方法
需要掌握的
process_request
1.请求来的时候会从上往下一次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.如果该方法自己返回了HttpResponse对象那么不再往后执行而是直接原路返回
process_response
1.响应走的时候会从下往上依次经过每一个注册了的中间件里面的该方法 如果没有则直接跳过
2.该方法有两个形参request和response 形参response指代的就是后端想要返回给前端浏览器的数据 该方法必须返回该形参 也可以替换
'''如果在执行process_request方法的时候直接返回了HttpResponse对象那么会原路返回执行process_response 不是执行所有的'''
django中间件三个了解的方法
1.process_view
路由匹配成功之后执行视图函数/类之前自动触发(顺序同process_request)
2.process_exception
试图函数/类执行报错自动触发(顺序用process_response)
3.process_template_response
视图函数/类返回的HttpResponse对象含有render并且对应一个方法的时候自动触发(顺序同process_response)
基于django中间件的功能设计
将各个功能制作成配置文件的字符串形式
如果想拥有该功能就编写对应的字符串
如果不想有该功能则注释掉对应的字符串
补充知识
如果利用字符串导入模块
import importlib
s1 = 'bbb.b'
res = importlib.import_module(s1) # from bbb import b
print(res) # <module 'bbb.b' from 'D:\\pythonProject03\\djangomiddle\\bbb\\b.py'>
'''注意字符串的结尾最小单位只能是py文件 不能是py文件里面的变量名'''
需求分析
模拟编写一个消息通知功能(微信、qq、邮箱)
方式1:基于函数封装的版本
没有眼前一亮的感觉 很一般
方式2:基于django中间件的功能设计(插拔式设计)
#########################################
项目名
notify
__init__.py
from settings import NOTIFY_LIST
import importlib
def send_all(content):
for full_path in NOTIFY_LIST:
module_path,class_str_name = full_path.rsplit('.',maxsplit=1)
# 1.利用字符串导入模块 拿到模块名
module_name = importlib.import_module(module_path)
# 2.利用反射从模块中获取字符串对应的类名
class_name = getattr(module_name,class_str_name)
# 3.利用类名加括号产生对象
obj = class_name()
# 4.对象调用发送消息的方法
obj.send_msg(content)
email.py
class Email(object):
def __init__(self):
pass
def send_msg(self,content):
print('来自email的消息>>>%s' % content)
qq.py
class Qq(object):
def __init__(self):
pass
def send_msg(self, content):
print('来自qq的消息>>>%s' % content)
weixin.py
class Weixin(object):
def __init__(self):
pass
def send_msg(self, content):
print('来自weixin的消息>>>%s' % content)
settings.py
NOTIFY_LIST = [
'notify.email.Email',
'notify.qq.Qq',
'notify.weixin.Weixin',
]
start.py
import notify
if __name__ == '__main__':
notify.send_all('你酱紫认真!!')
#########################################
Django框架——cookie与session简介、django操作cookie与session、django中间件的更多相关文章
- 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化
第三百零九节,Django框架,models.py模块,数据库操作——F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...
- 第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多
第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多.一对一.多对多 链表操作 链表,就是一张表的外键字段,连接另外一张表的主键字段 一对多 models.Forei ...
- 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查
Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...
- 第三百零六节,Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
- 五 Django框架,models.py模块,数据库操作——表类容的增删改查
Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...
- 四 Django框架,models.py模块,数据库操作——创建表、数据类型、索引、admin后台,补充Django目录说明以及全局配置文件配置
Django框架,models.py模块,数据库操作——创建表.数据类型.索引.admin后台,补充Django目录说明以及全局配置文件配置 数据库配置 django默认支持sqlite,mysql, ...
- Django框架之ORM(数据库)操作
一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例 ...
- 七 Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化
F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from django.db.models import F from django.shortcuts import rende ...
- jquery.cookie.js && java后台代码 操作cookie实现记住当前用户输入信息代码
下载jquery.cookie.js地址看这里:http://pan.baidu.com/s/1gdCPaN5 //初始化页面时验证是否记住了密码 $(document).ready(function ...
- Django框架(二) MTV模型简介
MTV模型 Django的MTV分别代表 Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件 模板语法:目的是将白变量(数据库的内 ...
随机推荐
- 一款开源、免费、跨平台的Redis可视化管理工具
前言 经常有小伙伴在技术群里问:有什么好用的Redis可视化管理工具推荐的吗?, 今天大姚给大家分享一款我一直在用的开源.免费(MIT License).跨平台的Redis可视化管理工具:Anothe ...
- 阿里云Python UDP Server和client基础教程
壹: socket通信是常用的一种通信方式,熟练掌握,快速的入戏,是一个程序员必备的素质. 贰: 注意:udp和tcp的套接字: 服务端代码: #!/usr/bin/env python3 # -*- ...
- 加密与安全:非对称加密算法 RSA 1024 公钥、秘钥、明文和密文长度
RSA 1024 是指公钥及私钥分别是 1024bit,也就是 1024/8 = 128Bytes. RSA 原理 RSA 算法密钥长度的选择是安全性和程序性能平衡的结果,密钥长度越长,安全性越好,加 ...
- springboot打印启动信息
打印启动信息 转载自:www.javaman.cn 1 spring Bean实例化流程 基本流程: 1.Spring容器在进行初始化时,会将xml或者annotation配置的bean的信息封装成一 ...
- 从API到Agent:万字长文洞悉LangChain工程化设计
我想做一个尝试,看看能不能用尽量清晰的逻辑,给"AI外行人士"(当然,我也是--)引入一下LangChain,试着从工程角度去理解LangChain的设计和使用.同时大家也可以将此 ...
- Three.js实现可透视的水面效果
1. 引言 Three.js是著名的JavaScript 3D图形库,用于浏览器中开发 3D 交互场景的 JS 引擎,可以快速的搭建三维场景 Three.js官网为:创建一个场景 – three.js ...
- KafkaConsumerDemo
pom <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>sp ...
- ContiPerf是一个轻量级的测试工具,基于JUnit 4 开发,可用于效率测试等。
1.在maven中使用ContiPerf <dependency> <groupId>junit</groupId> <artifactId>junit ...
- QT实现参数批量配置
QT实现批量配置 需求 一些参数需要批量化配置 之前搭建的FPGA的寄存器控制模型 使用AXI-lite搭建 直接操作上位机 这里需要一个可以快速配置所有参数的上位机 需要保存文件,可以保留上一次的参 ...
- UEFI引导双系统安装archlinux后安装windows8.1,os-prober无法探测,生成grub.cfg没有windows
1.os-prober无法探测 可能是os-prober未启用 启用os-prober: sudo vim /etc/default/grub 添加: GRUB_DISABLE_OS_PROBER=f ...