Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',
1、Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误
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验证 2、Django中使用ajax做post提交防止出现403错误的方法
现在以ajax发送一个请求,注意get和post的区别,post会被forbidden,get不会,
url 文件
![](/assets/blank.gif)
from django.conf.urls import url from django.contrib import adminfrom app01 import viewsurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^login/', views.login),url(r'^ajax_send/', views.ajax_send), ]
![](/assets/blank.gif)
在views文件中,
def ajax_send(request):return HttpResponse("ok")
在前端页面,,
![](/assets/blank.gif)
{% load staticfiles %} <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script src="{% static 'jquery-3.2.1.js' %}"></script></head> <body><button>ajax发送</button></body><script>$("button").click(function () {$.ajax({url:"/ajax_send/",data:{"user":"gu"},type:"POST", ----------如果以get请求是不会被forbidden,只有post请求会被forbidden,success:function (data) {alert(data)}})})</script></html>
![](/assets/blank.gif)
ajax的post请求会报错,forbidden
Forbidden (CSRF token missing or incorrect.): /ajax_send/ [10/Dec/2017 10:58:41] "POST /ajax_send/ HTTP/1.1" 403 2502 Forbidden (CSRF token missing or incorrect.): /ajax_send/ [10/Dec/2017 10:59:22] "POST /ajax_send/ HTTP/1.1" 403 2502 Forbidden (CSRF token missing or incorrect.): /ajax_send/
如果想要避免forbidden,
方法1:要在ajax发送请求前加上
$.ajaxSetup({ data:{csrfmiddlewaretoken:'{{ csrf_token }}'},}); 注意:{{ csrf_token }} ,是需要渲染的,不能脱离模板,所以是外部文件引入的话,不能执行,
![](/assets/blank.gif)
{% load staticfiles %} <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><script src="{% static 'jquery-3.2.1.js' %}"></script></head> <body><button>ajax发送</button></body><script>$("button").click(function () {$.ajaxSetup({data:{csrfmiddlewaretoken:'{{ csrf_token }}'},---------});$.ajax({url:"/ajax_send/",data:{"user":"gu"},type:"POST",success:function (data) {alert(data)}})})</script></html>
![](/assets/blank.gif)
方法2:在ajax发送请求是加上csrfmiddlewaretoken,的值,
![](/assets/blank.gif)
$.ajax({url:"/ajax_send/",data:{"user":"gu","csrfmiddlewaretoken":$("[name='csrfmiddlewaretoken']").val()},-----与方法1的功能一样, 但这种方法可以作为一个外部文件引入,type:"POST",success:function (data) {alert(data)}})})
![](/assets/blank.gif)
-------
方法3:修改header,
在views打印cookie可以得到csrftoken
![](/assets/blank.gif)
def index(request):print("cookie",request.COOKIES)#cookie {# 'csrftoken': 'AB9v1MGTbdpSGg3FaGCIiUxrKVR8zKSqgdGFDn5E0ADsJ2ST7N2zgW6KboQ8G31x',# 'sessionid': 'eexw5p38vky9qo38nf372dz5lj1br6xf'# }#cookie 是浏览器给的,return HttpResponse("index")
![](/assets/blank.gif)
需要先下载一个jquery.cookie.js插件文件,然后引用,
<script src="{% static 'jquery.cookie.js' %}"></script>
![](/assets/blank.gif)
{% load staticfiles %} <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title>{# <script src="{% static 'jquery-3.2.1.js' %}"></script>#}<script src="{% static 'jquery.cookie.js' %}"></script></head> <body>{#<form action="/login/" method="post">#} {# csrf_token 在前端会渲染出一个input标签,是一组键值对,键是csrfmiddlewaretoken,值是随机字符串,会随着下面的input标签一起提交,只有这种形式发送post的请求才能被接收,#} {##} {# {% csrf_token %}#} {# <p>用户名:{{ form_obj.user }}</p>#} {# <p>密 码:{{ form_obj.pwd }}</p>#} {# <input type="submit">#} {##} {#</form>#}<button>ajax发送</button></body><script>{# $("button").click(function () {#} {##} {# $.ajaxSetup({#} {# data:{csrfmiddlewaretoken:'{{ csrf_token }}'},#} {# });#} {##} {# $.ajax({#} {##} {# url:"/ajax_send/",#} {# data:{"user":"gu","csrfmiddlewaretoken":$("[name='csrfmiddlewaretoken']").val()},#} {# type:"POST",#} {# success:function (data) {#} {# alert(data)#} {# }#} {##} {#{)#}$('button').click(function () {$.ajax({url:"/ajax_send/",type:"post",headers:{"X_CSRFToken":$.cookie('csrftoken')},---------------success:function () {alert(123)}}) })</script></html>
![](/assets/blank.gif)
-----
input 标签的上传文件,
在前端页面
![](/assets/blank.gif)
{#发送文件的时候,要加上enctype ,是以块的方式发送文件,#} <form action="/login/" method="post" enctype="multipart/form-data"><input type="file" name="fileobj"></form><button>ajax发送</button>
![](/assets/blank.gif)
在views文件中,获取文件,保存文件,
![](/assets/blank.gif)
def login(request):if request.method == "POST":print("post",request.POST.get("fileobj"))print("post",type(request.POST.get("fileobj")))print("===",request.FILES)fileobj = request.FILES.get("fileobj")#创建一个文件句柄,把文件存起来,f=open(fileobj.name,'wb')for i in fileobj.chunks():#按块存f.write(i)
![](/assets/blank.gif)
转载于:https://www.cnblogs.com/dushangguzhousuoli/p/10649756.html
Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',相关推荐
- Django 中的中间件
Django 中的中间件 Django 中间件 中间件介绍 前戏 之前在判断登录的时候使用的是装饰器的功能,通过给视图函数加装饰器来增加判断是否登录的功能.但此方法的缺点是必须给每个需要判断登录的视 ...
- django中,中间件是什么以及中间件的作用
中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django ...
- Django中Ajax提交数据的CSRF问题
错误信息: Forbidden (CSRF token missing or incorrect.): 什么是CSRF: django为用户实现防止跨站请求伪造的功能,通过中间件 django.mid ...
- Django中不携带token导致csrf验证失败解决方法
1 问题 在使用Django发送post等请求时如果不懈怠csrf的token就会出现403 Forbidden错误. 2 解决方式 如果很多接口都不需要csrf验证的话,则可以将settings文件 ...
- django中的中间件执行顺序
中间件是什么? 本质上是一些类.在经过view之前一系列执行的方法. 中间件: process_request process_view process_template process_except ...
- Django基础之中间件
一:中间件 中间件:django 中的中间件(middleware),在django中,就是一个类.在请求来和结束后,Django会根据自己的规则在合适的时机执行中间件的相应方法: 应用:对所有请求或 ...
- Django框架(26.Django中的CSRF以及登录装饰器)
CSRF简介 CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造.CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件, ...
- Django CSRF(什么是CSRF?)\Django前后端分离csrf token获取方式
文章目录 Django CSRF 什么是CSRF? Django CSRF Django CSRF 中间件 Django,Ajax提交csrf_token处理 Django 设置 cookie 中的 ...
- django中的缓存以及跨域
django中的缓存 先来了解以下问题?(面试会问) 如何提高网站的并发量: QPS:Queries Per Second意思是"每秒查询率",是一台服务器每秒能够相应的查询次数, ...
最新文章
- 某阿里程序员女朋友吐槽男友整天玩失踪!早晨问候一声,晚上十一点才回信息!中间完全消失!阿里加班真的这么恐怖吗?...
- 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理)
- [翻译] JTCalendar
- 一个使用 asyncio 协程的网络爬虫(一)
- Ubuntu16.04彻底删除旧内核
- ogg 11.2 for mysql_配置ogg异构mysql-oracle 单向同步
- 拿不到offer全额退款 | 第四期人工智能 NLP / CV 课 培训招生
- 只进ResultSet 不支持请求的操作
- VMware的linux虚拟机实现和windows的文件共享
- SQLServer日期格式化
- 三大数据库数据库端口号及连接jdbc驱动下载
- numpy中多维数组的轴(axis)
- python代码示例-Python3 实例
- POJ1001 —— Exponentiation(高精度幂问题)
- apache-commons之BeanUtils、ConvertUtils、PropertyUtils、CollectionUtils的基本使用
- MYSQL安装以及登录问题_飘云羽逸_新浪博客
- 【C++】2048游戏系列---功能模块第四稿【结束检测】
- python日程提醒小程序_用Python写个爬虫小程序,给女朋友每日定时推送睡前小故事...
- 风控策略分析师日常--代码、数据、策略
- 数据挖掘十大经典算法(转存)
热门文章
- MacBook苹果笔记本电脑卡顿怎么解决?
- PTA 厘米换算英尺英寸
- 分布式存储Ceph 架构 以及 IO算法流程简介
- BugScan插件编写高(gǎo)级(jī)教程
- VASP5.4.4编译
- MOS管参数-MOS管参数含义说明及详解
- 数电(第二章、逻辑电路)
- 不到20W纯电SUV提回家,到店实拍2022款奇瑞大蚂蚁
- vi/vim虐我千百遍,我待vi/vim如初恋
- 用等价类和边界值法设计NextDate问题的测试用例并进行测试,具体要求如下:NextDate是一个有3个变量(月份、日期和年)的函数。函数返回输入日期后一天的日期。变量月份、日期和年都具有整数值