django学习之- CSRF及中间件
CSRF # 表示django全局发送post请求均需要字符串验证
功能:防止跨站请求伪造的功能
工作原理:客户端访问服务器端,在服务器端正常返回给客户端数据的时候,而外返回给客户端一段字符串,等到客户端下次访问服务器
端时,服务器端会到客户端查找先前返回的字符串,如果找到则继续,找不到就拒绝。
访问流程:客户端-》URL路由系统 - 》 CSRF -》视图函数
需要在客户端页面的post表单内添加:{% csrf_token %}
全局生效:
中间件 django.middleware.csrf.CsrfViewMiddleware
局部生效:
@csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
@csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件。
写法如下:
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def index(request): # 这样表示此函数取消CSRF验证
实例:登录页面通过ajax进行form表单提交
<body> <div class="container"> <form id='logfrom' class="form-signin">
{% csrf_token %}
<h2 class="form-signin-heading">主机管理页面</h2>
<label for="inputusername" class="sr-only">用户名</label>
<input type="text" id="inputusername" class="form-control" name="uname" placeholder="username" required="" autofocus=""><span class="nameinfo hide">用户名错误</span>
<label for="inputPassword" class="sr-only">密码</label>
<input type="password" id="inputPassword" class="form-control" name="upwd" placeholder="Password" required=""><span class="pwdinfo hide">密码错误</span>
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<input id='login' class="btn btn-lg btn-primary btn-block" type="button" value="登录">
</form> </div> <!-- /container --> <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<script src="/static/ie10-viewport-bug-workaround.js"></script>
<script src="/static/jquery-1.12.4.min.js"></script>
<script src="static/jquery-cookie/jquery.cookie.js"></script>
<script>
$('#login').click(function () {
//以下的ajaxSetup为全局的csrf设置
$.ajaxSetup({
// xhr为XmlHttpRequest 对象,是一个固定写法
beforeSend: function (xhr, settings) {
/*这里settings代表下面将要执行的ajax里面的内容*/
// 以下表示设置请求头
xhr.setRequestHeader('X-CSRFtoken', $.cookie('csrftoken'))
}
}); $.ajax({
url:'/index',
type:'post',
data:{'logname':$('#inputusername').val(),'logpwd':$('#inputPassword').val()},
success:function (data) {
if (data == 'ok'){
location.href = '/index'
}if(data == 'nmerr'){
$('.nameinfo').removeClass('hide');
}if(data =='pwderr'){
$('.pwdinfo').removeClass('hide');
}
}
})
})
</script>
</body>
views函数中对应的函数设置
from django.views.decorators.csrf import csrf_exempt,csrf_protect
@csrf_exempt
def index(request):
........
中间件
可以定义5个方法:
- process_request
- process_view
- process_response
- process_exception # 做异常处理
- process_template_response # 了解即可,如果views中的函数返回的对象中具有render方法,才执行这个函数
适合对所有的请求做统一操作,(如:黑名单)
游览器-URL -中间件-视图函数
实例如:
settings的MIDDLEWARE配置:
'middle.MIDDLE.M1',
'middle.MIDDLE.M2',
'middle.MIDDLE.M3',
模块MIDDLE文件内容
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse class M1(MiddlewareMixin):
def process_request(self,request):
print('中间件1')
def process_view(self,request,view_func,view_func_args,view_func_kwargs):
'''
:param request: 请求数据
:param view_func: 视图函数
:param view_func_args: 视图函数参数
:param view_func_kwargs: 视图函数参数
:return:
'''
print('新添加中间件1')
def process_response(self,request,response):
print('中间件返回1')
return response
def process_exception(self,request,exception):
''' 当执行的视图函数运行出现错误,则执行此方法提示'''
if isinstance(exception,ValueError):
return HttpResponse('当前的view函数出现了异常,请检查') def process_template_response(self, request, response):
# 如果试图函数views中的函数返回的对象中,具有render方法,才执行
pass
return response
class M2(MiddlewareMixin):
def process_request(self,request):
print('中间件2')
def process_view(self,request,view_func,view_func_args,view_func_kwargs):
print('新添加中间件2')
def process_response(self, request, response):
print('中间件返回2')
return response
class M3(MiddlewareMixin):
def process_request(self,request):
print('中间件3')
def process_view(self,request,view_func,view_func_args,view_func_kwargs):
print('新添加中间件3')
def process_response(self, request, response):
print('中间件返回3')
return response
请求流程:访问-》M1.process_request -> M2.process_request -> M3.process_request -> 返回
M1.process_view -> M2.process_view -> M3.process_view -> 视图函数 -> M3.process_response->M2.process_response->M1.process_response
django学习之- CSRF及中间件的更多相关文章
- Django学习手册 - csrf
CSRF csrf原理 无csrf时存在隐患 Form提交 Ajax提交 默认为全局都csrf Form表单提交方式: <div> <form action="/login ...
- Django学习笔记之Django中间件
准备 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装饰 ...
- Django学习笔记(15)——中间件
当Django处理一个Request的过程是首先通过中间件,然后再通过默认的URL方式进行的.我们可以在Middleware这个地方把所有Request拦截住,用我们自己的方式完成处理以后直接返回Re ...
- Django(六)Session、CSRF、中间件
大纲 二.session 1.session与cookie对比 2.session基本原理及流程 3.session服务器操作(获取值.设置值.清空值) 4.session通用配置(在配置文件中) 5 ...
- Django学习笔记之上下文处理器和中间件
上下文处理器 上下文处理器是可以返回一些数据,在全局模板中都可以使用.比如登录后的用户信息,在很多页面中都需要使用,那么我们可以放在上下文处理器中,就没有必要在每个视图函数中都返回这个对象. 在set ...
- Python之路-(Django(csrf,中间件,缓存,信号,Model操作,Form操作))
csrf 中间件 缓存 信号 Model操作 Form操作 csrf: 用 django 有多久,我跟 csrf 这个概念打交道就有久了. 每次初始化一个项目时都能看到 django.middlewa ...
- Django学习---CSRF
CSRF xss攻击:假设我们网站的评论里面允许用户写js的时候,每个人就会看到页面会执行这个js代码,有的是alert,不停的跳出弹框.这个还不算严重的,关键是如果js代码运行的结果不显示在页面上, ...
- Django学习系列之中间件
中间件的定义 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的请求进行控制 中间件是一类 django请求生命周期 自定义中 ...
- Django学习系列之CSRF
Django CSRF 什么是CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果 某个用户已经登录到 ...
随机推荐
- windows 下防火墙安全加固,配置规则
netsh advfirewall firewall: 显示关于防火墙操作的常见命令的帮助信息 netsh advfirewall firewall show rule name=all dir=in ...
- 洛谷 P2580 于是他错误的点名开始了
题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). ...
- (转)在编写Spring框架的配置文件时,标签无提示符的解决办法
http://blog.csdn.net/yerenyuan_pku/article/details/52831618 问题描述 初学者在学习Spring框架的过程中,大概会碰到这样一个问题:在编写S ...
- 嵌入式C语言-学习书籍推荐(pdf附上百度云链接)
先推荐学习视频网站: https://www.bilibili.com/video/av22631677?from=search&seid=800092160484173881 书籍只推荐2本 ...
- Linux之 if命令——简单的shell文件
如何写一个shell文件,写一个小脚本 1.新建一个脚本文件:vi demo.sh 2.追加执行权限: chmod u+x demo.sh 3.执行脚本:./demo.sh 4.什么是脚本?把一堆命令 ...
- BZOJ1232: [Usaco2008Nov]安慰奶牛cheer(最小生成树)
题意:给一个图 需要找到一个子图使得所有点都连通 然后再选择一个点做为起点 走到每个点并回到起点 每条边,每个点被经过一次就要花费一次边权.点权 题解:肯定是找一颗最小生成树嘛 然后惊奇的发现 任意选 ...
- gcc 变量类型大小 练习 远离 cygwin64 需要带dll
/* testmini.c -- very simple test program for the miniLZO library */ #include <stdio.h> #inclu ...
- 使用 隧道技术 使用http代理连接 svn:// git://
问题点 在某些情况下 无法通过代理 用 svn 访问svn://协议例如(svn://www.qdac.cc ) 故此有了此贴 远端需要一个代理 服务器 connect-tunnel -P 代理 ...
- 217. Contains Duplicate@python
Given an array of integers, find if the array contains any duplicates. Your function should return t ...
- nginx解决跨域(前后端分离)
Nginx解决跨域问题 后端接口 请求地址 返回数据(json数据) http://127.0.0.1:8080//app Hello World! 前端代码 通过nginx做静态资源服务器访问端口8 ...