Ajax

Ajax简介

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

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

同步交互与异步交互

Ajax特点:

  • 异步
  • 浏览器页面局部刷新(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

场景:

基于jquery的Ajax实现

$(".class").click(function(){      绑定事件
$.ajax({
url:"",
type:"GET/post",
data: {
a:1,
b:2,
}
success: function(res){
响应处理
}
})
})

基于post请求的json请求内容格式

Python中引入JsonResponse:

from django.http import JsonResponse

Javascript中自定义对象({ })与json字符串的转换:

# <1> 自定义对象转换成json字符串: JSON.stringify()
# <2> json字符串转换成自定义对象: 变量名.parse()

contentType为json的基于Ajax请求:

<input type="button" class="ajax-btn" value="submit_json">
<script>
$('.ajax_btn').click(function(){
$.ajax({
url:'/put1/',
type:'post',
contentType:'json',
data:JSON.stringify({
a:1,
b:2
}),
success:function(res){
响应处理
}
})
})
</script>

文件上传

请求头ContentType

ContentType指的是请求体的编码的类型,常见的类型共有3种:

1. application/x-www-form-urlencoded

这是最常见的POST提交数据的方式。浏览器的原生<form>表单,如里不设置enctype属性,那么最终就会以application/x-www-form-urlencoded方式提交数据。请求类似于下面这样(无关的请求头在本文中都省略掉了):

POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8 user=Ethan&age=22

2. multipart/form-data

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

这种方式一般用来上传文件,各大服务端语言对它也有着良好的支持

看如下请求示例:

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA ------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="user" Ethan
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

这个例子稍微复杂点:

  • 首先生成了一个boundary用于分割不同的字段,为了避免与正文内容重复,boundary很长很复杂。
  • 然后Content-Type里指明了数据是以multipart/form-data来编码,本次请求的boundary是什么内容。
  • 消息主体里按照字段个数又分为多个结构类似的部分,每部分都是以—boundary开始,紧接着是内容描述信息,然后是回车,最后是字段具体内容(文本或二进制)
  • 如果传输的是文件,还要包含文件名和文件类型信息。消息主体最后以—boundary—标示结束。

关于multipart/form-data详细定义,可参考rfc 1867

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

3. application/json

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

基于form表单的文件上传

模板部分

<form action="/put/", method="post", enctype="multipart/form-data">
{% csrf_token %}
<input type="text" name="user">
<input type="file" name="file">
<input type="submit">
</form>

视图部分

def put(request):
file_obj = request.FILES.get("file")
name = file_obj.name
with open("", "wb") as f_w:
for line in file_obj:
f_w.write(line)
return HttpResponse("上传成功")

基于Ajax的文件上传

<div>
{% csrf_taken %}
<input type="text" class="user">
<input type="file" class="file">
<input type="button" value="submit" class="ajax_btn">
</div>
<script>
$(".ajax_btn").click(function(){
let formdata = new FormData();
formdata.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val())
formdata.append("user", $(".user").val());
formdata.append("file", $(".file")[0].files[0]);
$.ajax({
url: "/put/",
type: "post",
contentType: false, // 不设置内容类型
processData: false, // 不处理数据
data: formdata,
success: function(res){
响应内容
}
})
})
</script>

应用

1. 用户名是否已被注册

在注册表单中,当用户填写了用户名后,把光标移开后,会自动向服务器发送异步请求。服务器返回true或false,返回true表示这个用户名已被注册过,返回false表示没有注册过。客户端得到服务器返回的结果后,确定是否在用户名文本框后显示"用户名已被注册"的错误信息。

2. 基于Ajax进行登录验证

用户在表单输入用户名与密码,通过Ajax提交给服务器,服务器验证后返回响应信息,客户端通过响应信息确定是否登录成功,成功,则跳转到首页,否则,在页面上显示相应的错误信息。

Django-Ajax组件的更多相关文章

  1. python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  2. 9.24 Django Form组件

    2018-9-23 20:10:04 这两天优化了自己图书管理系统 github 连接:https://github.com/TrueNewBee/pythonDemo 顺便整理了博客,写了好多总结, ...

  3. 编写轻量ajax组件01-对比webform平台上的各种实现方式

    前言 Asp.net WebForm 和 Asp.net MVC(简称MVC) 都是基于Asp.net的web开发框架,两者有很大的区别,其中一个就是MVC更加注重http本质,而WebForm试图屏 ...

  4. Django ajax MYSQL Highcharts<1>

    Another small project with django/Ajax/Mysql/Highcharts. 看下效果图  - delivery dashboard .嘿嘿 是不是还蛮好看的. 废 ...

  5. django ajax练习

    这几天遇到了django ajax请求出错的问题,总结一下 前端js:我这里创建的是一个字典格式的数据,前端js收到字典之后也是要用字典的形式去解包后台传送过来的数据,比如我下面的写法:data['s ...

  6. django Form组件

    django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...

  7. 关于Django Ajax CSRF 认证

    CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的 ...

  8. django -----分页器组件

    分页器组件 本文目录 1 Django的分页器(paginator)简介 2 应用View层 3 模版层 index.html 4 扩展 回到目录 1 Django的分页器(paginator)简介 ...

  9. django ajax增 删 改 查

    具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...

  10. Django - Xadmin 组件(一)

    Django - Xadmin 组件(一) Web 应用中离不开的就是后台管理, Django 自带的 admin 组件提供了一部分内容,但往往现实项目中会有更多的需求,所以自定义自己的后台管理就十分 ...

随机推荐

  1. 【原创】《从0开始学Elasticsearch》—document的单/批量crud

    内容目录 1.新建文档2.查询文档3.修改文档4.删除文档 1.新建文档 1). 语法1,手动指定document 的id: PUT /index_name/type_name/id{    &quo ...

  2. 弹射起步~django

    sudo apt-get installl tree 开始创建工作目录 django-admin.py startproject mysite 创建一个名为 mysite的子目录,然后我们通过tree ...

  3. 跟我一起玩Win32开发(12):使用控件——单选按钮

    今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少. 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决问 ...

  4. UVA - 1658 Admiral

    3. C - Admiral 题意:给定v(3<=v<=1000)个节点,e(3<=e<=10000)条边的又向加权图,求1->v的两条不相交的路径,使得权和最小. 思路 ...

  5. toLocaleSting()

    之前一直忽略了这一方法,直到前天的笔试题,两种方式实现如下功能... 1234567890→1,234,567,890 当时我的思路是这样的:1.字符串反转,插入逗号,再反转 2.求余数,将字符串一分 ...

  6. 生产环境中nginx既做web服务又做反向代理

    一.写对于初入博客园的感想 众所周知,nginx是一个高性能的HTTP和反向代理服务器,在以前工作中要么实现http要么做反向代理或者负载均衡.尚未在同一台nginx或者集群上同时既实现HTTP又实现 ...

  7. pscp多线程传输文件

    前面说过pscp不支持多线程,所以在此特地实现了一个 程序分三个部分: 1.初始化各种参数,涉及getopt函数的使用 2.重新定义scp,实现传递IP然后远程拷贝 3.启动多线程调用scp,涉及多线 ...

  8. PropTypes 和组件参数验证

    我们来了到了一个非常尴尬的章节,很多初学的朋友可能对这一章的知识点不屑一顾,觉得用不用对程序功能也没什么影响.但其实这一章节的知识在你构建多人协作.大型的应用程序的时候也是非常重要的,不可忽视. 都说 ...

  9. 《Python基础教程》 读书笔记 第五章(下)循环语句

    5.5.1while循环 x=1 while x<=100: print x x+=1 确保用户输入了名字: name="" while not name: name=raw ...

  10. 开启server-status失败

    近日在配置监控宝的apache监控老是出错,经过研究发现如下: 下面先做一些简要的介绍,以防以后查看之用. 一.server-status是什么?二.如何打开server-status?三.serve ...