day13 cookie与session和中间件

今日内容概要

  • cookie与session简介
  • django操作cookie与session
  • django中间件简介
  • 如何自定义中间件
  • csrf跨站请求伪造(钓鱼网站)
  • csrf相关操作

cookie与session简介

http协议
四大特性
1.基于请求响应
2.基于TCP\IP作用于应用层之上
3.无状态
基于http协议通信的服务端无法保存客户端状态
纵使见她千百遍 我都当她如初见
4.无(短)连接 随着互联网的发展 很多网站都需要保存客户端状态 为了实现该需求
# cookie与session应运而生(最初的功能核心:保存用户状态)
cookie:服务端让客户端浏览器保存的数据(kv键值对)
session:服务端保存的关于用户相关的数据(kv键值对)
'''session的工作需要依赖于cookie''' # 目前只要是需要用户登录的网站 基本都需要使用cookie
客户端浏览器也可以拒绝保存cookie

django操作cookie

# 视图函数必须返回HttpResponse对象
from django.shortcuts import HttpResponse,render,redirect
return HttpResponse()
return render()
return redirect() # 要想操作cookie必须先产生对象,之后利用对象内置方法操作
obj1 = HttpResponse()
return obj1
obj2 = render()
return obj2
obj3 = redirect()
return obj3 # 设置与获取cookie
obj.set_cookie() # 让浏览器保存cookie数据
request.COOKIES.get() # 获取浏览器携带过来的cookie数据
obj.set_cookie(max_age\expires) # 以秒为基准
obj.delete_cookie() # 获取当前用户想要访问的地址
request.path_info # 仅获取url的后缀名
request.get_full_path() # 获取的全路径,包含问号后面的参数部分

代码练习

from django.shortcuts import render, HttpResponse, redirect

# Create your views here.
from functools import wraps
# 校验登录装饰器
def login_auth(func):
@wraps(func) # 装饰器修复技术
def inner(request, *args, **kwargs):
# 给参数赋值获取访问之前页面的数据
target_url = request.path_info
# 先校验用户的cookie
cookie_data = request.COOKIES.get('name')
if cookie_data == 'meng':
res = func(request, *args, **kwargs)
return res
else:
# 加上target_url可以获取登录之前访问的页面
return redirect('/login/?target_url=%s' % target_url)
return inner @login_auth
def home(request):
return HttpResponse('登录页面该展示的内容') @login_auth
def index(request):
return HttpResponse('index页面,登录页面该展示的内容') @login_auth
def func(request):
return HttpResponse('func页面,登录页面该展示的内容') def login(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'meng' and password == '123':
# 先获取用户登录之前需要访问的页面,如果没有数据跳转到首页
target_url = request.GET.get('target_url', '/home/') # 如果前面没有数据,使用后面的数据
obj = redirect(target_url)
# 设置cookie
obj.set_cookie('name', 'meng',expires=3) # expires:设置几秒丢掉cookie
# 跳转到首页
return obj
return render(request, 'login.html') # 退出
def logout(request):
obj = redirect('/home/')
obj.delete_cookie('name')
return obj

django操作session

request.session[key] = value  # 设置session
1.django自动产生一个随机字符串
2.默认在django_session表中保存随机字符串与数据的对应关系
3.将随机字符串发送给客户端浏览器保存
sessionid:随机字符串 request.session.get(key) # 获取session
1.django自动获取浏览器发送过来的cookie数据 获取随机字符串
2.拿着随机字符串去django_session表中比对
3.如果对应上了则获取数据并解密成明文的形式 '''
需要记住的:
1.django默认的session失效时间>>>:两周(14天)
2.同一个计算机上一个浏览器只会有一条数据生效,当session过期的时候可能会出现多条
还有可能是不同浏览器访问,也可能出现多条数据。
''' # 删除当前会话的所有Session数据
request.session.delete() # 只删除浏览器数据,客户端不会删除
  
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush() # 推荐使用
这用于确保前面的会话数据不可以再次被用户的浏览器访问 # 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。 # session的存储位置是可以自定义的
1. 数据库Session
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎

session流程解析

django中间件

django中间件类似于django的门户 请求来和走都必须经过它
'''
当我们需要给web后端添加一些全局相关的功能时可以使用中间件
1.校验每个用户的访问频率
2.校验每个用户的登录状态
3.用户黑名单、白名单
4.用户权限
...
'''
django默认有七个中间件 并且还支持用户自定义中间件
自定义中间件我们可以编写五个方法
必须掌握的方法
# process_request(self,request) 1.当请求来的时候会从上往下依次执行每一个中间件里面的该方法
如果没有则直接下一个
2.当该方法返回了HttpResponse对象 那么请求不再继续往后执行
而是直接原路返回 # process_response(self,request,response)
1.当响应返回的时候会从下往上依次执行每一个中间件里面的该方法
如果没有则直接下一个 该方法默认要返回response
2.该方法返回什么浏览器就会接收到什么(也就意味着我们可以中途拦截待返回的数据做其他处理)
# process_request方法如果直接返回HttpResonse对象则直接执行process_response原理返回 需要了解的方法
process_view
路由匹配成功之后执行视图函数之前自动触发 process_template_response
当返回的对象中含有render属性自动触发 process_exception
当视图函数报错之后会自动触发

中间件简介

什么是中间件?
官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。 但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。 说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。 我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项。 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',
]

自定义中间件

中间件可以定义五个方法,分别是:(主要的是process_request和process_response)
必须掌握的方法:
process_request(self,request)
process_response(self, request, response) 需要了解的方法:
process_view(self, request, view_func, view_args, view_kwargs)
process_template_response(self,request,response)
process_exception(self, request, exception) 以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。

自定义一个中间件实例

process_request

# 我们来看看多个中间件时,Django是如何执行其中的process_request方法的。
# 自定义mymiddleware.py
from django.utils.deprecation import MiddlewareMixin
class MyMdd1(MiddlewareMixin):
def process_request(self, request):
print('我是mdd1的request方法') class MyMdd2(MiddlewareMixin):
def process_request(self, request):
print('我是mdd2的request方法') # views.py
def ab_md(request):
print('我是视图函数ab_md')
return HttpResponse('ab_md') # settions.py
MIDDLEWARE = [
'app01.mymiddleware.MyMdd1', # 自定义中间件mdd1
'app01.mymiddleware.MyMdd2' # 自定义中间件mdd2
] 后端打印:
我是mdd1的request方法
我是mdd2的request方法
我是视图函数ab_md # 总结:
1.中间件的process_request方法是在执行视图函数之前执行的
2.当配置多个中间件时,会按照MIDDLEWARE中的注册顺序,也就是列表的索引值,从前到后的一次执行。
3.不同中间件之间传递的request都是同一个对象
4.当该方法返回了HttpResponse对象,那么请求不再继续往后执行,而是直接原路返回

process_response

# 自定义mymiddleware.py
class MyMdd1(MiddlewareMixin):
def process_request(self, request):
print('我是mdd1的request方法') def process_response(self, request,response):
print('我是mdd1的response方法')
return response class MyMdd2(MiddlewareMixin):
def process_request(self, request):
print('我是mdd2的request方法') def process_response(self, request,response):
print('我是mdd2的response方法')
return response # 其余和上述代码一致
后端打印:
我是mdd1的request方法
我是mdd2的request方法
我是视图函数ab_md
我是mdd2的response方法
我是mdd1的response方法 # 总结:
1.当响应返回的时候会从下往上依次执行每一个中间 件里面的该方法,如果没有则直接下一个 该方法默认要返回response 2.该方法返回什么浏览器就会接收到什么(也就意味着我们可以中途拦截待返回的数据做其他处理) # 原理和击鼓传花一样,一个传一个 3.当中间件返回了HttpResponse对象,那么请求不再继续往后执行,而是直接原路返回
# process_request方法如果直接返回HttpResonse对象则直接执行process_response原路返回

day13 cookie与session和中间件的更多相关文章

  1. Django --- cookie与session,中间件

    目录 1.cookie与session 1.cookie 2.session 2.中间件 1.中间件作用 2.用户可以自定义的五个方法 3.自定义中间件 1.cookie与session 1.cook ...

  2. Django之cookie与session、中间件

    目录 cookie与session 为什么会有cookie和session cookie 设置cookie 获取cookie 删除cookie 实例:cookie版登录校验 session 设置ses ...

  3. cookie和session django中间件

    目录 一.cookie和session 1. 为什么要有cookie和session 二.cookie 1. 什么是cookie 2. django中关于cookie的使用 (1)后端设置cookie ...

  4. cookie、session和中间件

    目录 cookie和session cookie与session原理 cookie Google浏览器查看cookie Django操作cookie 获取cookie 设置cookie 删除cooki ...

  5. Django框架-cookie和session以及中间件

    目录 一.cookie 和 session 1.为什么会有这些技术 2. cookie 2.1 Django如何设置cookie 2.2 Django如何获取cookie 2.3 Django如何设置 ...

  6. cookie与session django中间件

    目录 一.什么是cookie 二.django中操作cookie 2.1 如何操作cookie 2.2 操作cookie 三.什么是session 四.django中操作session 4.1 创建c ...

  7. cookie、session以及中间件

    cookie cookie是保存客户端浏览器上的键值对,是服务端设置在客户端浏览器上的键值对,也就意味着浏览器其实可以拒绝服务端的'命令',默认情况下浏览器都是直接让服务端设置键值对 设置cookie ...

  8. cookie 和 session 的一些事 中间件

    cookie 和 session cookie 1. 保存在浏览器上一组组键值对,服务器让浏览器进行设置. 2. 为什么要用cookie? HTTP协议是无状态.使用cookie保存状态. 3. dj ...

  9. Django进阶(路由系统、中间件、缓存、Cookie和Session、Ajax发送数据

    路由系统 1.每个路由规则对应一个view中的函数 url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P&l ...

随机推荐

  1. 关于把RTL工程代码封装成IP时对define宏定义参数的处理

    在把RTL工程封装成IP的时候,如果工程中的代码中含有global include中定义的参数,则vivado不支持该参数文件的封装.出现IP_FLOW 19-4646的错误代码,解决方法: 1.在用 ...

  2. 构建乘积数组 牛客网 剑指Offer

    构建成绩数组 牛客网 剑指Offer 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...*A[i-1]A[i ...

  3. AppScan 10安装使用

    一.简介 AppScan是IBM的一款web安全扫描工具,具有利用爬虫技术进行网站安全渗透测试的能力,能够根据网站入口自动摸取网页链接进行安全扫描,提供了扫描.报告和修复建议等功能. appscan有 ...

  4. 远程设备管理opendx平台搭建-server,agent以及front实际搭建

    本系列文章讲述的是一个系列的第二部分,最终可以搭建一整套设备远程管理平台,与stf不同的是,opendx搭建较为简单,而且由于底层是appium来支持的,所以,较容易支持ios,也容易支持更高版本的安 ...

  5. CSS px的理解

    px是像素.然而一个屏幕像素的多少是由屏幕的分辨率决定的. 取个极端的栗子:如果分辨率是1w*1w,你设置一个100px宽的输入框,你只占屏幕的1/100,但是如果屏幕的分辨率是100*100,那么你 ...

  6. 用Python实现人像动漫化

    用Python实现人像动漫化 本文章会教你如何使用Python实现人像动漫化,先看看效果实例: 实现过程如下: 本案例是使用百度的API来实现的,首先需要进入百度AI开放平台注册账号,具体流程就不讲了 ...

  7. 从零搭建vsftpd

    先吐槽一下这个工具,配置繁琐,限制规则复杂,报错信息不够详细,学起来吃力. 准备工作 [root@vsftp-server ~]# mkdir /data/ #创建ftp目录 [root@vsftp- ...

  8. SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClient(上)

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们来测试下前面封装好的 WebClient,这里开始,我们使用 spock 编写 gro ...

  9. 获取客户端Mac地址

    近期有个需求,需要获取客户端Mac地址作为白名单验证的依据.使用.net,B/S架构.先百度找了一些获取mac地址的方法, using System; using System.Collections ...

  10. Elasticsearch分布式搜索和数据分析引擎-ElasticStack(上)v7.14.0

    Elasticsearch概述 **本人博客网站 **IT小神 www.itxiaoshen.com Elasticsearch官网地址 https://www.elastic.co/cn/elast ...