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 文件

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),
]

在views文件中,

def ajax_send(request):return HttpResponse("ok")

在前端页面,,

{% 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>

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 }} ,是需要渲染的,不能脱离模板,所以是外部文件引入的话,不能执行,
{% 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>

方法2:在ajax发送请求是加上csrfmiddlewaretoken,的值,

        $.ajax({url:"/ajax_send/",data:{"user":"gu","csrfmiddlewaretoken":$("[name='csrfmiddlewaretoken']").val()},-----与方法1的功能一样, 但这种方法可以作为一个外部文件引入,type:"POST",success:function (data) {alert(data)}})})

-------

 

方法3:修改header,

在views打印cookie可以得到csrftoken

def index(request):print("cookie",request.COOKIES)#cookie {# 'csrftoken': 'AB9v1MGTbdpSGg3FaGCIiUxrKVR8zKSqgdGFDn5E0ADsJ2ST7N2zgW6KboQ8G31x',# 'sessionid': 'eexw5p38vky9qo38nf372dz5lj1br6xf'# }#cookie 是浏览器给的,return HttpResponse("index")

需要先下载一个jquery.cookie.js插件文件,然后引用,

<script src="{% static 'jquery.cookie.js' %}"></script>
{% 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>

-----

input 标签的上传文件,

在前端页面

{#发送文件的时候,要加上enctype ,是以块的方式发送文件,#}
<form action="/login/" method="post" enctype="multipart/form-data"><input type="file" name="fileobj"></form><button>ajax发送</button>

在views文件中,获取文件,保存文件,

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)

 
 

转载于:https://www.cnblogs.com/dushangguzhousuoli/p/10649756.html

Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',相关推荐

  1. Django 中的中间件

    Django 中的中间件 Django  中间件 中间件介绍 前戏 之前在判断登录的时候使用的是装饰器的功能,通过给视图函数加装饰器来增加判断是否登录的功能.但此方法的缺点是必须给每个需要判断登录的视 ...

  2. django中,中间件是什么以及中间件的作用

    中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django ...

  3. Django中Ajax提交数据的CSRF问题

    错误信息: Forbidden (CSRF token missing or incorrect.): 什么是CSRF: django为用户实现防止跨站请求伪造的功能,通过中间件 django.mid ...

  4. Django中不携带token导致csrf验证失败解决方法

    1 问题 在使用Django发送post等请求时如果不懈怠csrf的token就会出现403 Forbidden错误. 2 解决方式 如果很多接口都不需要csrf验证的话,则可以将settings文件 ...

  5. django中的中间件执行顺序

    中间件是什么? 本质上是一些类.在经过view之前一系列执行的方法. 中间件: process_request process_view process_template process_except ...

  6. Django基础之中间件

    一:中间件 中间件:django 中的中间件(middleware),在django中,就是一个类.在请求来和结束后,Django会根据自己的规则在合适的时机执行中间件的相应方法: 应用:对所有请求或 ...

  7. Django框架(26.Django中的CSRF以及登录装饰器)

    CSRF简介 CSRF全拼为Cross Site Request Forgery,译为跨站请求伪造.CSRF指攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你名义发送邮件, ...

  8. Django CSRF(什么是CSRF?)\Django前后端分离csrf token获取方式

    文章目录 Django CSRF 什么是CSRF? Django CSRF Django CSRF 中间件 Django,Ajax提交csrf_token处理 Django 设置 cookie 中的 ...

  9. django中的缓存以及跨域

    django中的缓存 先来了解以下问题?(面试会问) 如何提高网站的并发量: QPS:Queries Per Second意思是"每秒查询率",是一台服务器每秒能够相应的查询次数, ...

最新文章

  1. 某阿里程序员女朋友吐槽男友整天玩失踪!早晨问候一声,晚上十一点才回信息!中间完全消失!阿里加班真的这么恐怖吗?...
  2. 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理)
  3. [翻译] JTCalendar
  4. 一个使用 asyncio 协程的网络爬虫(一)
  5. Ubuntu16.04彻底删除旧内核
  6. ogg 11.2 for mysql_配置ogg异构mysql-oracle 单向同步
  7. 拿不到offer全额退款 | 第四期人工智能 NLP / CV 课 培训招生
  8. 只进ResultSet 不支持请求的操作
  9. VMware的linux虚拟机实现和windows的文件共享
  10. SQLServer日期格式化
  11. 三大数据库数据库端口号及连接jdbc驱动下载
  12. numpy中多维数组的轴(axis)
  13. python代码示例-Python3 实例
  14. POJ1001 —— Exponentiation(高精度幂问题)
  15. apache-commons之BeanUtils、ConvertUtils、PropertyUtils、CollectionUtils的基本使用
  16. MYSQL安装以及登录问题_飘云羽逸_新浪博客
  17. 【C++】2048游戏系列---功能模块第四稿【结束检测】
  18. python日程提醒小程序_用Python写个爬虫小程序,给女朋友每日定时推送睡前小故事...
  19. 风控策略分析师日常--代码、数据、策略
  20. 数据挖掘十大经典算法(转存)

热门文章

  1. MacBook苹果笔记本电脑卡顿怎么解决?
  2. PTA 厘米换算英尺英寸
  3. 分布式存储Ceph 架构 以及 IO算法流程简介
  4. BugScan插件编写高(gǎo)级(jī)教程
  5. VASP5.4.4编译
  6. MOS管参数-MOS管参数含义说明及详解
  7. 数电(第二章、逻辑电路)
  8. 不到20W纯电SUV提回家,到店实拍2022款奇瑞大蚂蚁
  9. vi/vim虐我千百遍,我待vi/vim如初恋
  10. 用等价类和边界值法设计NextDate问题的测试用例并进行测试,具体要求如下:NextDate是一个有3个变量(月份、日期和年)的函数。函数返回输入日期后一天的日期。变量月份、日期和年都具有整数值