cookie、session以及中间件
cookie
cookie是保存客户端浏览器上的键值对,是服务端设置在客户端浏览器上的键值对,也就意味着浏览器其实可以拒绝服务端的‘命令’,默认情况下浏览器都是直接让服务端设置键值对
设置cookie
obj1.set_cookie()
获取cookie
request.COOKIES.get()
删除cookie
obj1.delete_cookie()
cookie实现登陆功能
from functools import wraps
def login_auth(func):
@wraps(func)
def inner( request,*args,**kwargs):
if request.COOKIES.get('username'):
res=func( request,*args,**kwargs)
return res
else:
target_url=request.path_info ###获取到网页的url
return redirect('/login/?next=%s'%target_url)
return inner
def login(request):
if request.method=='POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jason' and password == '123':
old_path = request.GET.get('next')
if old_path:
# 保存用户登录状态
obj = redirect(old_path)
else:
obj = redirect('/home/')
obj.set_cookie('name', 'lzs') # 让客户端浏览器 记录一个键值对
# obj.set_cookie('name','jason',max_age=5) # 让客户端浏览器 记录一个键值对
return obj
return render(request, 'login.html')
@login_auth
def home(request):
# if request.COOKIES.get('name'):
# return HttpResponse('我是主页,只有登陆了才能看')
# return redirect('/login/')
return HttpResponse('我是主页,只要登录了才能看')
@login_auth
def index(request):
return HttpResponse('我是index')
session
session是保存在服务器上的键值对,django session默认的过期时间是14天
设置session
request.session['key']=value 仅仅只会在内存产生一个缓存
1、django内部自动生成了随机的字符串
2、在django_session表中存入数据
3、将产生的随机的字符串发送给浏览器,让浏览器保存到cookie中
获取session
request.seesion.get('key')
1、浏览器发送cookie到django_session表中对比,是否有对应的数据
2、拿着随机字符串去django_session表中比对,取出赋值给request.session,
如果对不上那么request.session就是个空
(django session表是针对浏览器的,不同的浏览器来,才会有不同额记录)
删除session
request.session.delete() #只删除服务端的session
request.session.flush() #浏览器和服务端全部删除
session也可以设置超时时间
request.session.set_expiry(value 多种配置)
数字、0、不写、时间格式
from functools import wraps
def login_auth(func):
@wraps(func)
def inner(request,*args,**kwargs):
if request.session.get('username'):
res = func(request,*args, **kwargs)
return res
else:
target_url=request.path_info
return redirect('/login/?next=%s'%target_url)
return inner
def login(request):
if request.method=='POST':
username=request.POST.get('username')
password=request.POST.get('password')
old_path = request.GET.get('next')
print(old_path)
if username=='lzs' and password=='123':
request.session['username'] = username
if old_path:
obj= redirect(old_path)
else:
return redirect('/home/')
# obj.set_cookie('name', 'lzs')
return render(request,'login.html')
django中间件
- 用户访问频率限制
- 用户是否是黑名单
- 所有用户登录校验
- 只要涉及到网址全局的功能就该使用中间件
django中间件暴露给程序员五个可以自定义的方法(五个方法都是在特定的条件下自动触发的)
1、新建一个文件夹,里面新建一个任意名称的py文件,里面写类,固定继承类
from django.utils.deprecation import MiddlewreMixin
class MyMiddle(MiddlewareMixin):
2、去配置文件注册到中间件中,手写字符串的路径
'app01.mymiddleware.myaabb.MyMiddle1'
需要掌握:
process_request():
请求来的时候会从上往下经过每一个中间件里面,process_request一旦里面返回了
HttpResponse对象那么就不再往后执行了,会执行同一级别
eg:def process_request(self,request):
print('我是第一个自定义中间件里面的process_request方法')
return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值")
process_response():响应走的时候会从下往上依次经过每一个中间件里面process_response
eg:def process_response(self,request,response):
# response就是要返回给用户的数据
print("我是第一个自定义中间件里面的process_response方法")
return response
了解:
process_view:路由匹配成功之后执行视图函数之前触发
process_exception:当视图函数出现异常(bug)的时候自动触发
process_template_response:当视图函数执行完毕之后并且返回的对象中含有render方法的情况下才会触发
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse
class MyMiddle1(MiddlewareMixin):
def process_request(self,request):
print('我是第一个自定义中间件里面的process_request方法')
# return HttpResponse("我是第一个自定义中间件里面的HttpResponse对象返回值")
def process_response(self,request,response): # response就是要返回给用户的数据
print("我是第一个自定义中间件里面的process_response方法")
return response
def process_view(self,request,view_func,view_args,view_kwargs):
print(view_func,view_args,view_kwargs)
print('我是第一个自定义中间件里面的process_view方法')
def process_exception(self,request,exception):
print(exception)
print('我是第一个自定义中间件里面的process_exception方法')
def process_template_response(self,request,response):
print('我是第一个自定义中间件里面的process_template_response方法')
return response
class MyMiddle2(MiddlewareMixin):
def process_request(self,request):
print('我是第二个自定义中间件里面的process_request方法')
def process_response(self, request, response): # response就是要返回给用户的数据
print("我是第二个自定义中间件里面的process_response方法")
return response
def process_view(self,request,view_func,view_args,view_kwargs):
print(view_func,view_args,view_kwargs)
print('我是第二个自定义中间件里面的process_view方法')
def process_exception(self,request,exception):
print(exception)
print('我是第二个自定义中间件里面的process_exception方法')
def process_template_response(self,request,response):
print('我是第二个自定义中间件里面的process_template_response方法')
return response
跨站请求伪造(csrf)
就类似你搭建了一个跟银行一模一样的web页面,用户在你的网站转账的时候输入用户名、密码、对方账户,银行里面的钱确实少了,但是发现收款人变了
最简单的原理:
你写的form表单中用户的用户名、密码都会真实的提交给银行后台,但是收款账户却不是用户填的,你暴露给用户的是一个没有name属性的input框,你自己提前写好了一个带有name和value的input框
解决钓鱼网站的策略:
只要是用户想要提交post请求的页面,在返回给用户的时候提前设置好一个随机字符串,当用户提交post请求的时候,自动先查取是否有该随机字符串,如果有正常提交,没有直接报403
form表单:
你在写的时候只需加上一个{% csrf_token %}
ajax:
第一种自己在页面上先通过{% csrf_token %}获取随机字符串,然后利用标签查找
data:{'username':'jason','csrfmiddlewaretoken'
cookie、session以及中间件的更多相关文章
- cookie与session django中间件
目录 一.什么是cookie 二.django中操作cookie 2.1 如何操作cookie 2.2 操作cookie 三.什么是session 四.django中操作session 4.1 创建c ...
- 1204 中间件以及cookie,session
目录 一 .cookie与session原理 1.cookie 操作 1.1 设置cookie set_cookie 1.2 获取cookie request.COOKIES.get('k1') 1. ...
- cookie、session和中间件
目录 cookie和session cookie与session原理 cookie Google浏览器查看cookie Django操作cookie 获取cookie 设置cookie 删除cooki ...
- Django框架-cookie和session以及中间件
目录 一.cookie 和 session 1.为什么会有这些技术 2. cookie 2.1 Django如何设置cookie 2.2 Django如何获取cookie 2.3 Django如何设置 ...
- day13 cookie与session和中间件
day13 cookie与session和中间件 今日内容概要 cookie与session简介 django操作cookie与session django中间件简介 如何自定义中间件 csrf跨站请 ...
- Cookie Session和自定义分页
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- python自动化开发-[第十九天]-分页,cookie,session
今日概要: 1.cookie和session 2.csrf 跨站请求伪造 3.自定义分页 一.上节回顾: http请求的本质: - Http请求本质 浏览器(socket客户端): 2. socket ...
- day70 cookie & session 前后端交互分页显示
本文转载自qimi博客,cnblog.liwenzhou.com 概要: 我们的cookie是保存在浏览器中的键值对 为什么要有cookie? 我们在访问浏览器的时候,千万个人访问同一个页面,我们只要 ...
- node.js cookie session使用教程
众所周知,HTTP 是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据,如何能把一个用户的状态数据关联起来呢? cookie 首先产生了 cookie 这门技术来 ...
- Cookie Session 和Django分页
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
随机推荐
- D - How Many Answers Are Wrong HDU - 3038【带权并查集】
How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- C#继承是个啥
继承: 字面意思就是继承 如地主老王有500亩地,老王的儿子小王可以种这五百亩地可以随便拿这五百亩地上面的任何东西 如Controller 你要用从一个controller调用另一个controlle ...
- mybatis一级缓存和二级缓存(二)
注意事项与示例配置 一级缓存 Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存,一级缓存只是相对于同一个SqlSession而言.所以在参数和SQL完全一样的情况下,我们使用 ...
- 我的python笔记06
面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做< ...
- linux 安装 Django14
一.实际安装过程(只操作这一步就可以安装) ## 下载并安装 rpm -ivh http://cbs.centos.org/kojifiles/packages/Django14/1.4.20/1.e ...
- thinkphp中如何用路由调用前台html界面
先上图片看看基本的文件位置 1.首先在application\route.php中定义路由 <?php use think\Route; Route::get("home", ...
- Java注释&标识符
注释: 单行注释:// 多行注释:/* */ 文档注释:/** */ 其中文档注释可以Export导出dox文档,常用Javadox标记如下: @author:指定Java程序的作者 @vers ...
- python logging模块日志回滚RotatingFileHandler
# coding=utf-8 import logging import time import os import logging.handlers def logger(appname,roots ...
- H5 App设计者需要注意的问题
我们通常在做H5 APP设计的过程中,遇到很多看似很小,且很容易被忽略的问题,正是这些小问题,一次次的撩拨用户的耐心,让用户对你的APP心生怨念.现在WeX5君呕血为大家整理出H5 APP设计的21条 ...
- 线性混合+ROI
相关代码: #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namesp ...
- cookie与session django中间件