一、回顾上节知识点

1、什么是json字符串?

  轻量级的数据交换格式

2、定时器:关于setTimeout

setTimeout(foo,3000)  # 3000表示3秒,foo表示一个函数,3秒后执行foo函数

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>Title</title>
  8. <style>
  9. .login_error{
  10. color: red;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15.  
  16. <a href="/get_OK/">点击</a><span class="error"></span>
  17. <hr>
  18. {% csrf_token %}
  19. <p>姓名<input type="text"></p>
  20. <p>密码<input type="password"></p>
  21. <p><button class="Ajax_send">Ajax_send</button><span class="login_error"></span></p>
  22.  
  23. <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js "></script>
  24. <script>
  25. $(".Ajax_send").click(function () {
  26. function foo() {
  27. $(".login_error").html(""); //3秒后清空
  28. }
  29. //方式一
  30. $.ajaxSetup({
  31. data:{csrfmiddlewaretoken:'{{ csrf_token }}'}
  32. });
  33. // ajax请求
  34. $.ajax({
  35. url:"/get_ajax/", //请求路径
  36. type:"POST", //请求方式
  37. //吧js对象转成json字符串
  38. data:{
  39. {# 方式三#}
  40. {# csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),#}
  41. name:$(":text").val(),
  42. pwd:$(":password").val()
  43. },
  44. success:function (data) {
  45. var data=JSON.parse(data); //js中的反序列化
  46. console.log(data);
  47. console.log(typeof data);
  48. if(!data["flag"]){ //为False的情况
  49. $(".login_error").html("用户名或者密码错误");
  50. setTimeout(foo,3000)
  51. }
  52. }
  53. })
  54. })
  55. </script>
  56. </body>
  57. </html>

3、ajax的参数补充

   - type不写的话默认是GET

  - dataType和ContentType:

    dataType: 浏览器发给服务器希望返回的数据类型 。。如果我们明确地指定目标类型,就可以使用data Type。

    ContentType:
      请求头里有:浏览器告诉服务器内容的类型
      响应头里也有:服务器响应浏览器的内容

4、JS和JQuery对象之间的转换

  jQuery对象加[0]就转换成了dom对象
  dom对象加$符就转换成了jquery对象

5、processDate 默认为True ,预处理;     如果改为False,不做预处理

二、csrf跨站请求伪造

如果把type:"GET"  改为type:"POST" 会报一个Forbidden的错

解决办法有三种:

方式一:

  1. $.ajaxSetup({
  2. data:{csrfmiddlewaretoken:'{{ csrf_token }}'}
  3. });
  4. 注意:要放在ajax请求的前面,在发送之前组装一组字符串,在第一步render的时候就发了
  5. 所以有局限性:
  6. 如果把JS代码放到静态文件中,不会渲染,不会执行{{csrf_token}},只能在HTML页面中使用

方式二:自己组装一组键值对  ( 推荐)

  1. <form>
    {% csrf_token %}
    </form>
  2. data:{
  3. csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),
  4. name:$(":text").val(),
  5. pwd:$(":password").val()
  6. },

方式三:自己设置头信息

  1. <script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
  2. $.ajax({
  3. url:"/serialize/",
  4. type:"POST",
  5. headers:{"X-CSRFToken":$.cookie('csrftoken')},
  6. })

三、jQuery.serialize()

serialize()函数用于序列化一组表单元素,将表单内容编码为用于提交的字符串

serialize()函数常用于将表单内容序列化,以便用于AJAX提交。

该函数主要根据用于提交有效表单控件的name和value,将它们拼接为一个可直接用于表单提交的文本字符串,该字符串已经过标准的URL编码处理(字符集编码为UTF-8)。

该函数不会序列化不需要提交的表单控件,这和常规的表单提交行为是一致的。例如:不在<form>标签内的表单控件不会被提交、没有name属性的表单控件不会被提交、带有disabled属性的表单控件不会被提交、没有被选中的表单控件不会被提交。

  1. 与常规表单提交不一样的是:常规表单一般会提交带有name的按钮控件,而serialize()函数不会序列化带有name的按钮控件。更多详情请点击这里。

语法:

  1. jQueryObject.serialize( )

serialize()函数的返回值为String类型,返回将表单元素编码后的可用于表单提交的文本字符串。

请参考下面这段初始HTML代码:

  1. <form name="myForm" action="http://www.365mini.com" method="post">
  2. <input name="uid" type="hidden" value="1" />
  3. <input name="username" type="text" value="张三" />
  4. <input name="password" type="text" value="123456" />
  5. <select name="grade" id="grade">
  6. <option value="1">一年级</option>
  7. <option value="2">二年级</option>
  8. <option value="3" selected="selected">三年级</option>
  9. <option value="4">四年级</option>
  10. <option value="5">五年级</option>
  11. <option value="6">六年级</option>
  12. </select>
  13. <input name="sex" type="radio" checked="checked" value="1" />
  14. <input name="sex" type="radio" value="0" />
  15. <input name="hobby" type="checkbox" checked="checked" value="1" />游泳
  16. <input name="hobby" type="checkbox" checked="checked" value="2" />跑步
  17. <input name="hobby" type="checkbox" value="3" />羽毛球
  18. <input name="btn" id="btn" type="button" value="点击" />
  19. </form>

对<form>元素进行序列化可以直接序列化其内部的所有表单元素。

  1. // 序列化<form>内的所有表单元素
  2. // 序列化后的结果:uid=1&username=%E5%BC%A0%E4%B8%89&password=123456&grade=3&sex=1&hobby=1&hobby=2
  3. alert( $("form").serialize() );

我们也可以直接对部分表单元素进行序列化。

  1. // 序列化所有的text、select、checkbox表单元素
  2. // 序列化后的结果:username=%E5%BC%A0%E4%B8%89&password=123456&grade=3&hobby=1&hobby=2
  3. alert( $(":text, select, :checkbox").serialize() );

示例:

  1. 1 <!DOCTYPE html>
  2. 2 <html lang="en">
  3. 3 <head>
  4. 4 <meta charset="UTF-8">
  5. 5 <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. 6 <meta name="viewport" content="width=device-width">
  7. 7 <title>Title</title>
  8. 8 </head>
  9. 9 <body>
  10. 10 <form name="myForm" action="http://www.365mini.com" method="post">
  11. 11 <input name="uid" type="hidden" value="1" />
  12. 12 <input name="username" type="text" value="张三" />
  13. 13 <input name="password" type="text" value="123456" />
  14. 14 <select name="grade" id="grade">
  15. 15 <option value="1">一年级</option>
  16. 16 <option value="2">二年级</option>
  17. 17 <option value="3" selected="selected">三年级</option>
  18. 18 <option value="4">四年级</option>
  19. 19 <option value="5">五年级</option>
  20. 20 <option value="6">六年级</option>
  21. 21 </select>
  22. 22 <input name="sex" type="radio" checked="checked" value="1" />男
  23. 23 <input name="sex" type="radio" value="0" />女
  24. 24 <input name="hobby" type="checkbox" checked="checked" value="1" />游泳
  25. 25 <input name="hobby" type="checkbox" checked="checked" value="2" />跑步
  26. 26 <input name="hobby" type="checkbox" value="3" />羽毛球
  27. 27 <input name="btn" id="btn" type="button" value="点击" />
  28. 28 </form>
  29. 29 <script src="/static/jquery-3.2.1.min.js"></script>
  30. 30 <script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
  31. 31 <script>
  32. 32 $("#btn").click(function () {
  33. 33 {# 方式一#}
  34. 34 //$.ajaxSetup({
  35. 35 // data:{csrfmiddlewaretoken:'{{ csrf_token }}'}
  36. 36 //});
  37. 37 $.ajax({
  38. 38 url:"/serialize/",
  39. 39 type:"POST",
  40. 40 {# 方式三#}
  41. 41 headers:{"X-CSRFToken":$.cookie('csrftoken')},
  42. 42 //data:$("form").serialize(), //序列form表单所有的
  43. 43 data:$(":text,:password,:checkbox").serialize(), //序列自己选择的
  44. 44 success:function (data) {
  45. 45 var data=JSON.parse(data); //js中的反序列化
  46. 46 console.log(data);
  47. 47 console.log(typeof data);
  48. 48 $(".error").html(data);
  49. 49 }
  50. 50 })
  51. 51 })
  52. 52 </script>
  53. 53 </body>
  54. 54 </html>

serialize.html

  1. 1 def serialize(request):
  2. 2 # form = request.POST
  3. 3 # print(form)
  4. 4 name = request.POST.get("username")
  5. 5 password = request.POST.get("password")
  6. 6 checked = request.POST.getlist("hobby")
  7. 7 print(name,password,checked)
  8. 8 return HttpResponse(json.dumps(name))

views.py

  1. 当有好多input的时候,就得一一对应的吧所有的数据发过去的,这样显得麻烦,我们用序列化
  2. jQuery.serialize()
  3.  
  4. data:$("form").serialize(), //序列form表单所有的
  5. data:$(":text,:password,:checkbox").serialize(), //序列自己选择的
  6.  
  7. 在服务端获取数据
  8. form = request.POST
  9. print(form) #获取所有
  10. name = request.POST.get("username")
  11. password = request.POST.get("password")
  12. checked = request.POST.getlist("hobby")
  13. print(name,password,checked)#获取单个

四、上传文件

1、Form表单上传文件

文件和其他的数据类型不一样,是一个二进制的形式
Form上传文件的时候切记要加上:enctype="multipart/form-data"

formupload.html

  1. <form action="/formupload/" method="post" enctype="multipart/form-data">
  2. {% csrf_token %}
  3. <p>姓名:<input type="text" name="username"></p>
  4. <p>密码:<input type="password" name="password"></p>
  5. <p>头像:<input type="file" name="file"></p>
  6. <p><input type="submit" value="提交"></p>
  7. </form>

view.py

  1. def formupload(request):
  2. if request.method == "POST":
  3. username = request.POST.get("username")
  4. password = request.POST.get("password")
  5. # file = request.FILES #拿到的是一个句柄
  6. file_obj = request.FILES.get("file")
  7. print(file_obj,file_obj.name)
  8. print(type(file_obj),type(file_obj.name)) #<class 'django.core.files.uploadedfile.InMemoryUploadedFile'> <class 'str'>
  9. with open(file_obj.name,"wb") as f:
  10. for i in file_obj:
  11. f.write(i)
  12. return HttpResponse("上传成功...")
  13. return render(request,"formupload.html")

2、Ajax上传文件(利用FormData):既可以处理二进制,又可以处理字典,列表啊等

FormData是什么呢?

XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个"表单".比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件.
所有主流浏览器的较新版本都已经支持这个对象了,比如Chrome 7+、Firefox 4+、IE 10+、Opera 12+、Safari 5+。
注意:下文中的几个需要解释的
  1. $("#upload") 拿到的是一个集合
  2. $("#upload")[0] 就是一个dom对象
  3. $("#upload")[0].files 拿到的是一个filelist
  4. $("#upload")[0].files[0] 拿到的是当前最近的文件对象

要是使用FormData一定要加上:

一定要加上:

  contentType:false
  processDate:false #不做预处理

ajaxupload.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width">
  7. <title>Title</title>
  8. </head>
  9. <body>
  10. <p>姓名<input type="text" name="username"></p>
  11. <p>头像<input type="file" id="upload"></p>
  12. <p><button class="btnnn">提交</button><span class="tishi"></span></p>
  13. <script src="/static/jquery-3.2.1.min.js"></script>
  14. <script src="https://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.js"></script>
  15. <script>
  16. $(".btnnn").click(function () {
  17. var formData=new FormData();
  18. formData.append("username",$(":text").val());
  19. formData.append("file",$("#upload")[0].files[0]);
  20. $.ajax({
  21. url:"/get_upload/",
  22. type:"POST",
  23. headers:{"X-CSRFToken":$.cookie('csrftoken')},
  24. data:formData,
  25. contentType:false,
  26. processData:false,
  27. success:function (data) {
  28. $(".tishi").html("上传成功")
  29. }
  30.  
  31. })
  32. })
  33. </script>
  34. </body>
  35. </html>

view.py

  1. def ajaxupload(request):
  2. return render(request,"ajaxupload.html")
  3.  
  4. def get_upload(request):
  5. if request.method == "POST":
  6. print("FIFLE", request.FILES)
  7. file_obj = request.FILES.get("file")
  8. print(file_obj.name, "-----")
  9. file_obj = request.FILES.get("file")
  10. with open(file_obj.name, "wb") as f:
  11. for i in file_obj:
  12. f.write(i)
  13. return HttpResponse("上传成功")

ajax补充FormData的更多相关文章

  1. ajax补充--------FormData等...

    一.回顾上节知识点 1.什么是json字符串? 轻量级的数据交换格式 2.定时器:关于setTimeout setTimeout(foo,3000)  # 3000表示3秒,foo表示一个函数,3秒后 ...

  2. Django【第21篇】:Ajax之FormData

    ajax补充--------FormData等... 一.回顾上节知识点 1.什么是json字符串? 轻量级的数据交换格式 2.定时器:关于setTimeout setTimeout(foo,3000 ...

  3. jQuery Ajax使用FormData上传文件和其他数据,后端web.py获取

    参考博文: 通过jQuery Ajax使用FormData对象上传文件 方法一:使用<form>表单初始化FormData对象方式上传文件 前端(JQuery): <form enc ...

  4. .Net之使用Jquery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径

    前言: 首先对于图片上传而言,在我们的项目开发中可以说出现的频率是相当的高的.这篇文章中,我将要描述的是在我们.Net中如何使用Jquery Ajax通过FormData对象异步提交图片文件到后台保存 ...

  5. 通过Ajax使用FormData对象无刷新上传文件

    写在前面:本文说的这个方案有浏览器兼容性问题:所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+.Firefox 4+.IE 10+.Opera 12+.Safari 5+,对兼容性比 ...

  6. 通过jQuery Ajax使用FormData对象上传文件

    FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单". 在 Mozilla Developer 网站 使用For ...

  7. jquery ajax 提交 FormData

    $('form').submit(function(){ var formdata=new FormData(this); $.ajax({ type:'POST', url:'/url/path', ...

  8. Ajax通过FormData上传文件

    1.使用<form>表单初始化FormData对象方式上传文件 HTML代码 <form id="uploadForm" enctype="multip ...

  9. ajax利用FormData异步文件提交

    通常情况下,我们上传文件都会使用form表单来提交文件.但有时候,我们会有异步提交文件的需求,在这种情况下,我们就需要新建一个Formdata来提交文件,后台如果使用的是PHP的话可以使用$_FILE ...

随机推荐

  1. spark学习4(zookeeper3.4集群搭建)

    第一步:zookeeper安装 通过WinSCP软件将zookeeper-3.4.8.tar.gz软件传送到/usr/zookeeper/目录下 [root@spark1 zookeeper]# ch ...

  2. R语言学习笔记(2)

    第二章:创建数据集 一 R中的数据 二 数据的输入 一R中的数据 数据集:通常是由数据构成的一个矩形数组,行表示观测,列表示变量 R可以处理的数据类型:数值型.字符型.逻辑型.复数型(虚数).原生型( ...

  3. tensorflow笔记:流程,概念和简单代码注释

    tensorflow是google在2015年开源的深度学习框架,可以很方便的检验算法效果.这两天看了看官方的tutorial,极客学院的文档,以及综合tensorflow的源码,把自己的心得整理了一 ...

  4. 任务1-1 了解Web基本概念

    1.认识网页 从图中可以看到,网页主要由文字.图像和超链接等元素构成.当然,除了这些元素,网页中还可以包含音频.视频及Flash. 为了快速了解网页是如何形成的,接下来查看一下网页的源代码

  5. hdu 2087 kmp

    http://acm.hdu.edu.cn/showproblem.php?pid=2087 算是模板题吧,找到一个子串之后将模板串指针归零否则会重复计算. #include<bits/stdc ...

  6. LNMP安装及配置

    LNMP官方网站:http://lnmp.org http://oneinstack.com/install/ 安装详细介绍:http://lnmp.org/install.html 1,安装LNMP ...

  7. mysql 库,表,数据操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  8. LeetCode OJ:Flatten Binary Tree to Linked List(捋平二叉树)

    Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...

  9. Linux-监控与安全运维之Nagios

    1. Nagios 简介是一个开源软件,可以监控网络设备网络流量.Linux/windows主机状态,甚至可以监控打印机它可以运行在Linux上或windows上基于浏览器的web界面方便运维人员查看 ...

  10. php 与 Smarty 中的 isset

    今天在做一个分页模块的时候,在获取前端返回的当前页时,烦了一个大错!本来应该是这样子滴: 而咱却写成了这个样子: 在php里输出测试都没错,结果到Smarty里就被拒了! 测试结果是 这货跟谁都相等, ...