一、什么是Ajax

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

二、Ajax的特点

1、异步

客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求

2、局部刷新

例如:

邮箱没写,会局部刷新邮箱区域,判断邮箱

三、Ajax优点

  • AJAX使用 Javascript 技术向服务器发送异步请求
  • AJAX无须刷新整个页面

四、 基于jquery的Ajax使用

1、基本语法

// 在templates模板层使用
$.ajax({
url:'/index/',
type:'post',
//data:往后台提交的数据
data:{'name':'lqz','age':18},
//成功的时候回调这个函数
success:function (data) {
alert(data)
}
})

2、完整使用语法

<!-- 先导入jQuery -->
<script src="/static/jquery-3.3.1.js"> </script>
<button class="send_Ajax">send_Ajax</button>
<script> $(".send_Ajax").click(function(){ $.ajax({
url:"/handle_Ajax/",
type:"POST",
data:{username:"Yuan",password:123},
success:function(data){
console.log(data)
},
      
error: function (jqXHR, textStatus, err) {
console.log(arguments);
}, complete: function (jqXHR, textStatus) {
console.log(textStatus);
}, statusCode: {
'': function (jqXHR, textStatus, err) {
console.log(arguments);
}, '': function (jqXHR, textStatus, err) {
console.log(arguments);
}
} }) }) </script>

3、利用ajax提交表单中的数据

<p><input type="text" name="add1" id="add1">+<input type="text" name="add2" id="add2">=<input type="text" name="sum" id="sum"></p>
<button class="btn">点我</button> <script>
$('.btn').click(function(){
$.ajax({
url:'add',
type:'post',
// 通过 .val() 获取值
data:{'add1':$('#add1').val(),'add2':$('#add2').val},
success:function(data){
// 将数据写在val(data)中,可以赋值
$('#sum').val(data)
location.href='/index/'
}
})
})
</script>

五、Ajax的执行流程

六、基于ajax进行文件上传

1、请求头ContentType

(1)application/x-www-form-urlencoded方式

这是最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。

(2)multipart/form-data方式

这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 <form> 表单的 enctype 等于 multipart/form-data

上面提到的这两种 POST 数据的方式,都是浏览器原生支持的,而且现阶段标准中原生 <form> 表单也只支持这两种方式(通过 <form> 元素的 enctype 属性指定,
默认为 application/x-www-form-urlencoded。其实 enctype 还支持 text/plain,不过用得非常少)。

(3)application/json方式

现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。

2、基于Form表单上传文件

(1)模板层

<!-- 必须指定 enctype="multipart/form-data" -->
<form action="/files/" method="post" enctype="multipart/form-data">
<p>用户名:<input type="text" name="name" id="name"></p>
<!-- 必须指定type="file" -->
<p><input type="file" name="myfile" id="myfile"></p>
<input type="submit" value="提交">
</form>
<button id="btn">ajax提交文件</button> <script>
$("#btn").click(function () {
// 上传文件,必须用FormData
var formdata=new FormData();
formdata.append('name',$("#name").val());
// 取出文件$("#myfile")[0].files拿到的是文件列表,取第0个把具体的文件取出来
formdata.append('myfile',$("#myfile")[0].files[0]); $.ajax({
url:'/files_ajax/',
type:'post',
// 告诉jQuery不要去处理发送的数据,(name=lqz&age=18)
processData:false,
// 指定往后台传数据的编码格式(urlencoded,formdata,json)
// 现在用formdata对象处理了,就不需要指定编码格式了,不要编码了
contentType:false,
data:formdata,
success:function (data) {
alert(data)
}
})
})
</script>

(2)视图层

def add_file(request):
if request.method=='GET':
return render(request,'add_files.html')
# 这是个字典
dic_files=request.FILES
myfile=dic_files.get('myfile')
with open(myfile.name,'wb') as f:
# 循环上传过来的文件
for line in myfile:
# 往空文件中写
f.write(line)
return HttpResponse('ok') def files_ajax(request):
# 提交文件从,request.FILES中取,提交的数据,从request.POST中取
name=request.POST.get('name')
print(name)
dic_files = request.FILES
myfile = dic_files.get('myfile')
with open(myfile.name, 'wb') as f:
# 循环上传过来的文件
for line in myfile:
# 往空文件中写
f.write(line)
return HttpResponse('ok')

(3)路由层

url(r'^files/$', views.add_file),
url(r'^files_ajax/', views.files_ajax),

注意点:

1、基于form表单上传文件,需要指定编码格式,那么ajax一样也是,首先我们先创建一个FormData的一个对象
2、我们通过append方法,给对象传值append(value1,value2),相当于value1=value2
3、processData:false, # 告诉jQuery不要去处理发送的数据
contentType:false, # 告诉jQuery不要去设置Content-Type请求头
4、processData的值只能是布尔值,因为这时的data的值,是一个对象,所以不需要进行处理了

六、基于ajax提交json格式数据

1、模板层

<form  >
<p>用户名:<input type="text" name="name" id="name"></p>
<p>密码:<input type="password" name="pwd" id="pwd"></p>
<input type="submit" value="提交">
</form> <button id="btn">ajax提交json格式</button>
</body> <script>
$('#btn').click(function () {
var post_data={'name':$("#name").val(),'pwd':$("#pwd").val()};
console.log(typeof post_data);
//JSON.stringify相当于python中json.dumpus(post_data),把数据装换位json格式字符串
//pos是个json格式字符串
var pos=JSON.stringify(post_data);
console.log(typeof pos);
$.ajax({
url:'/json/', // url这里为空的话,默认向该页面发出ajax请求
type:'post', // type值为空的话,默认为get方法
data:pos,
contentType:'application/json',
dataType:'json',
success:function (data) {
//如果data是json格式字符串,如何转成对象(字典)?
//data=JSON.parse(data)
console.log(typeof data)
console.log(data.status)
/*
console.log(data)
var ret=JSON.parse(data)
console.log(typeof ret)
console.log(ret.status)
*/ //alert(data) }
}) })
</script>

2、视图层

def add_json(request):
if request.method=='GET':
return render(request,'json.html')
print(request.POST)
print(request.GET)
print(request.body)
import json
# res是个字典
res=json.loads(request.body.decode('utf-8'))
print(res)
print(type(res))
dic={'status':'','msg':'登录成功'}
# return HttpResponse('ok')
# 返回给前台json格式
# return HttpResponse(json.dumps(dic))
return JsonResponse(dic)

3、路由层

url(r'^json/', views.add_json),

总结:

1、如果是文件,就先创建一个FormData对象,以key,value的位置,参传数进去
在ajax方法里,data对应的值就是这个FormData对象,所以在processData的值应该为false,
contentType的值也为false(让jquery不设置请求头)
注意:它文件在后面中request.FILES里面,如果有其他input框所对应的value,它的值在POST中取
2、如果不是上传文件,就是form表单的里input的话,就直接传了,contentType默认为urlencoded编码方法
3、json格式数据,首先是把对象给造出来,并且把数据放里面,然后转换成json格式字符串,这里contentType必须为'application/json',
这样它的的数据在request.body里,是二进制格式
4、在前端接收到后台json格式数据,可以在ajax那里写dataType:'json',它会自动转换成对象

Django框架(十二)-- Djang与Ajax的更多相关文章

  1. Django框架-模型层3/数据传输/Ajax

    目录 一.orm查询优化 1.only与defer 2.select_related与prefatch_related 二.模型层choices参数 三.MTV与MVC模型 1.MVC 2.MTV 3 ...

  2. Django框架(二十九)—— 跨域问题

    目录 跨域问题 一.同源策略 二.CORS(跨域资源共享) 三.CORS两种请求(简单请求与非简单请求) 1.简单请求(一次请求) 2.非简单请求(两次请求) 四.CORS在Django中的应用 1. ...

  3. Django(十二)视图--利用jquery从后台发送ajax请求并处理、ajax登录案例

    一.Ajax基本概念 [参考]:https://www.runoob.com/jquery/jquery-ajax-intro.html 异步的javascript.在不全部加载某一个页面部的情况下, ...

  4. Django框架(二十)-- Django rest_framework-权限组件

    一.权限组件的使用 # 用户信息表 class UserInfo(models.Model): name = models.CharField(max_length=32) # 写choice use ...

  5. Django框架(二十八)—— Django缓存机制

    目录 Django缓存机制 一.什么是缓存 二.Django的6中缓存方式及配置(只需要改配置文件) 1.开发调试缓存(此模式为开发调试使用,实际上不执行任何操作) 2.内存缓存(将缓存内容保存至内存 ...

  6. Django框架(二十六)—— Django rest_framework-分页器与版本控制

    目录 分页器与版本控制 一.三种分页器 二.分页器 1.普通分页(PageNumberPagination) 2.偏移分页(LimitOffsetPagination) 3.加密分页(CursorPa ...

  7. Django框架(二十)—— Django rest_framework-认证组件

    目录 Django rest_framework-认证组件 一.什么是认证 二.利用token记录认证过的用户 1.什么是token 2.token的原理 3.cookie.session.token ...

  8. Django框架(二十四)-- Django rest_framework-路由控制与响应器

    一.路由控制 # 1.基本路由: url(r'^publish/$', views.PublishView.as_view()), # 2.半自动路径:views.PublishView.as_vie ...

  9. Django框架(二十二)-- Django rest_framework-解析器

    一.解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理,将传过来的数据解析成字典 二.使用解析器 1.局部使用 在视图类中重定义parser_classes即可, ...

  10. Django框架(二十五)—— Django rest_framework-路由控制与响应器

    路由控制与响应器 一.路由控制 # 1.基本路由: url(r'^publish/$', views.PublishView.as_view()), # 2.半自动路径:views.PublishVi ...

随机推荐

  1. Python进阶-VI 生成器函数进阶、生成器表达式、推导式

    一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...

  2. TCP三次握手及四次断开,TCP有限状态机

    TCP 的连接建立 上图画出了 TCP 建立连接的过程.假定主机 A 是 TCP 客户端,B是服务端.最初两端的 TCP 进程都处于 CLOSED 状态.图中在主机下面的是 TCP进程所处的状态.A ...

  3. 第04组 Alpha冲刺(2/6)

    队名:new game 组长博客:戳 作业博客:戳 组员情况 鲍子涵(队长) 燃尽图 过去两天完成了哪些任务 整理了一下之前敲的代码 实现了一些新的功能 接下来的计划 实现更多的功能 还剩下哪些任务 ...

  4. Java连载9-数据类型&字符编码

    一.数据类型注意:(1)计算机最初只支持英文,最先出现的字符编码是:ASII码例如:‘a'对应97,对应01100001(2)编码和解码的时候采用同一套字典/对照表,不会出现乱码.否则会出现乱码.二. ...

  5. VUE引入jq bootstrap 之终极解决方案(测试)

    初入VUE遇见的一些问题,在网上找了些方法,再根据自己的实际项目解决的问题写得此文,,希望对你有所帮助. vue-cli快速构建项目以及引入boostrap.jq各种插件配置 vue-cli脚手架工具 ...

  6. Python【每日一问】36

    问: 基础题: 809*x=800*x+9*x+1 其中 x 代表的两位数, 8*x 的结果为两位数, 9*x 的结果为 3 位数.求 x ,及计算 809*x 的结果. 提高题: 对文件" ...

  7. linux开启tcp_timestamps和tcp_tw_recycle引发的问题研究

    环境:centos7.4 内核版本3.10 最近看内核参数tcp_tw_recycle(该参数在内核 4.12 之后被移除),它用于快速回收处理TIME_WAIT状态的socket.搜索该参数相关的资 ...

  8. python做一个简易图片下载工具

    代码有点乱,先这样 # -*- coding:utf-8 -*- #__author__ :kusy #__content__:文件说明 #__date__:2018/11/01 11:01 impo ...

  9. 怎么写自己的CMakeLists.txt--二

    之前写过一篇及其简单的关于CMakeLists.txt的写法,现在重点剖析find_package的用法. 如果程序中使用了外部库,事先并不知道它的头文件和链接库的位置,就要给出头文件和链接库的查找方 ...

  10. 【前端知识体系-CSS相关】CSS基础知识强化

    1.CSS样式(选择器)的优先级? 1.1 权重的计算规则 第一优先级:无条件优先的属性只需要在属性后面使用!important.它会覆盖页面内任何位置定义的元素样式.(ie6支持上有些bug). 第 ...