Django - AJAX

一. JSON

  什么是json?

  • json指的是JavaScript对象表示法(JavaScript Object Notation)
  • json是轻量级的文本数据交换格式
  • 独立于语言, 支持不同的编程语言
  • 具有自我描述性, 跟易理解

  合格的json对象:

["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["张三", "李四"] }
[ { "name": "张三"}, {"name": "李四"} ] 

  不合格的json对象:

{ name: "张三", 'age': 32 }         // 属性名必须使用双引号
[32, 64, 128, 0xFFF]             // 不能使用十六进制值
{ "name": "张三", "age": undefined }    // 不能使用undefined
{ "name": "张三","birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),"getName":  function() {return this.name;}  // 不能使用函数和日期对象
}

  python 

      数据类型: 字符串, 数字, 布尔值, 列表, 字典, Null

      序列化: Python数据类型 --> json 字符串

            json.dumps(Python数据类型)  json.dump(Python数据类型,f)         

      反序列化: json字符串 -->Python数据类型  

          json.loads(json字符串)  json.load(json字符串, f)

  前端

      数据类型: 字符串, 数字, 布尔值, 数组, 队象, null

      序列化: JSON.stringgify(Js的数据类型)

      反序列化: JSON.parse(json的字符串)

  JsonResponse

      from django.http import JsonResponse

      JsonResponse(字典)

      jsonResponse([], safe=False)

二. AJAX简介 

AJAXAsynchronous Javascript And XML)翻译成中文就是异步的JavascriptXML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

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

示例

页面输入两个整数,通过AJAX传输到后端计算出结果并返回。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>AJAX局部刷新实例</title>
</head>
<body><input type="text" id="i1">+
<input type="text" id="i2">=
<input type="text" id="i3">
<input type="button" value="AJAX提交" id="b1"><script src="/static/jquery-3.2.1.min.js"></script>
<script>$("#b1").on("click", function () {$.ajax({url:"/ajax_add/",type:"GET",data:{"i1":$("#i1").val(),"i2":$("#i2").val()},success:function (data) {$("#i3").val(data);}})})
</script>
</body>
</html>
HTML
def ajax_demo1(request):return render(request, "ajax_demo1.html")def ajax_add(request):i1 = int(request.GET.get("i1"))i2 = int(request.GET.get("i2"))ret = i1 + i2return JsonResponse(ret, safe=False)
Views.py
urlpatterns = [...url(r'^ajax_add/', views.ajax_add),url(r'^ajax_demo1/', views.ajax_demo1),...   
]
urls.py

 优点:

  • AJAX使用JavaScript技术向服务器发送异步请求;
  • AJAX请求无须刷新整个页面;
  • 因为服务器响应内容不再是整个页面,而是页面中的部分内容,所以AJAX性能高;

参数:

$.ajax({url: '/ajax_test/',    # 请求的地址type: 'post',          # 请求的方式data: {                    # 请求的数据name: 'alex',age: '73',hobby: JSON.stringify(['吃烧饼', '画大饼', '卖烧饼'])},success: function (res) {     # 正常响应的回调函数$('[name="ii3"]').val(res)},error:function (res) {         # 错误响应的回调函数
        console.log(res)}

三. jQuery实现的AJAX

  最基本的JQuery发送请求示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>ajax test</title><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<button id="ajaxTest">AJAX 测试</button>
<script>$("#ajaxTest").click(function () {$.ajax({url: "/ajax_test/",type: "POST",data: {username: "Q1mi", password: 123456},success: function (data) {alert(data)}})})
</script>
</body>
</html>
jQuery
def ajax_test(request):user_name = request.POST.get("username")password = request.POST.get("password")print(user_name, password)return HttpResponse("OK")
Views.py

  data参数中的键值对,如果值值不为字符串,需要将其转换成字符串类型。

$("#b1").on("click", function () {$.ajax({url:"/ajax_add/",type:"GET",data:{"i1":$("#i1").val(),"i2":$("#i2").val(),"hehe": JSON.stringify([1, 2, 3])},success:function (data) {$("#i3").val(data);}})})

四. JS实现AJAX

var b2 = document.getElementById("b2");b2.onclick = function () {// 原生JSvar xmlHttp = new XMLHttpRequest();xmlHttp.open("POST", "/ajax_test/", true);xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");xmlHttp.send("username=q1mi&password=123456");xmlHttp.onreadystatechange = function () {if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {alert(xmlHttp.responseText);}};}; 

五. AJAX请求如何设置csrf_token

  方式一. 

  通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送。

  页面中使用{% csrf_token %}, 给POSt提交数据中添加 csrfmiddlewaretoken 的键值对

#urls:
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/', views.index),url(r'^calc/', views.calc),#ajax:
$('#b1').click(function () {$.ajax({url: '/calc/',type: 'post',data: {'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val(),i1: $('[name="i1"]').val(),i2: $('[name="i2"]').val()},success: function (res) {$('[name="i3"]').val(res)}})#viewsdef calc(request):i1 = request.POST.get('i1', '')i2 = request.POST.get('i2', '')time.sleep(3)i3 = int(i1) + int(i2) if i1 and i2 else ''return HttpResponse(i3)});
示例
$.ajax({url: "/cookie_ajax/",type: "POST",data: {"username": "Q1mi","password": 123456,"csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val()  // 使用jQuery取出csrfmiddlewaretoken的值,拼接到data中},success: function (data) {console.log(data);}
})

  方式二

  通过获取返回cookie中的字符串 放置在请求头中发送

  注意:需要引入一个jquery.cookie.js插件。

$.ajax({url: "/cookie_ajax/",type: "POST",headers: {"X-CSRFToken": $.cookie('csrftoken')},  // 从Cookie取csrftoken,并设置到请求头中data: {"username": "Q1mi", "password": 123456},success: function (data) {console.log(data);}
})
View Code

  或者用自己写一个getCookie方法:

function getCookie(name) {var cookieValue = null;if (document.cookie && document.cookie !== '') {var cookies = document.cookie.split(';');for (var i = 0; i < cookies.length; i++) {var cookie = jQuery.trim(cookies[i]);// Does this cookie string begin with the name we want?if (cookie.substring(0, name.length + 1) === (name + '=')) {cookieValue = decodeURIComponent(cookie.substring(name.length + 1));break;}}}return cookieValue;
}
var csrftoken = getCookie('csrftoken');
View Code

  还可以使用$.ajaxSetup()方法为ajax请求统一设置。

function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}$.ajaxSetup({beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type) && !this.crossDomain) {xhr.setRequestHeader("X-CSRFToken", csrftoken);}}
});
View Code

  注意: 

  如果使用从cookie中取csrftoken的方式,需要确保cookie存在csrftoken值。

  如果你的视图渲染的HTML文件中没有包含 {% csrf_token %},Django可能不会设置CSRFtoken的cookie。

  这个时候需要使用ensure_csrf_cookie()装饰器强制设置Cookie。

django.views.decorators.csrf import ensure_csrf_cookie@ensure_csrf_cookie
def login(request):pass

六. AJAX上传文件

def upload(request):if request.is_ajax():file_obj = request.FILES.get('f1')with open(file_obj.name, 'wb') as f:for i in file_obj.chunks():f.write(i)return HttpResponse('上传成功')return render(request, 'upload.html')
View Code

  html 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="" enctype="multipart/form-data"></form>
<input type="file" name="f1">
<button id="b1">上传</button><script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script>$('#b1').click(function () {var form_obj = new FormData();form_obj.append('f1',$('[name="f1"]')[0].files[0])$.ajax({url:'/upload/',type:'post',processData:false,contentType:false,data:form_obj,success:function (res) {alert(res)}})})</script></body>
</html>

 

转载于:https://www.cnblogs.com/Ryan-Yuan/p/11573523.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

培育强人工智能的「ImageNet」:上海交大卢策吾组提出铰接物体知识库 AKB-48

来源&#xff1a;前沿科技编译&#xff1a;OGAI编辑&#xff1a;陈彩娴ImageNet 的出现极大推动了计算机视觉领域的发展。在通往强人工智能的路上&#xff0c;我们还需要考虑物体的外观、结构、物理性质、语义等因素。为此&#xff0c;上海交大卢策吾组近日重磅推出了大型真实世…

模块化认知:演化如何自下而上涌现出智能?

来源&#xff1a; 集智俱乐部作者&#xff1a;Michael Levin, Rafael Yuste译者&#xff1a;郭瑞东审校&#xff1a;刘志航、梁金 编辑&#xff1a;邓一雪 导语无论是聪明的人、哺乳动物、鸟类&#xff0c;还是细胞和组织、神经元网络、病毒以及蛋白质分子&#xff0c;在所有尺…

Stuart Russell:智能本质和人工智能安全的巨大挑战

斯图尔特罗素&#xff08;Stuart Russell&#xff09;&#xff0c;加州大学伯克利分校计算机科学专业教授&#xff0c;著有人工智能领域“标准教科书”——《人工智能&#xff1a;一种现代化方法》&#xff08;与谷歌研究主管Peter Norvig合著&#xff09;来源&#xff1a;智能…

费马大定理:三百年数学圣杯的角逐

来源&#xff1a;和乐数学费马大定理&#xff0c;又被称为“费马最后的定理”。人类前赴后继挑战了三个世纪&#xff0c;多次震惊全世界&#xff0c;耗尽人类众多最杰出大脑的精力&#xff0c;也让千千万万业余者痴迷。费马大定理的故事与数学的历史有着千丝万缕的联系&#xf…

Django - Form和ModelForm

一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

人工智能,“抛弃”真实数据集?

来源&#xff1a;学术头条当前&#xff0c;人工智能技术已经应用在我们日常生活中的方方面面&#xff0c;比如人脸识别、语音识别、虚拟数字人等。但普遍存在的一个问题是&#xff0c;科研人员要想通过训练一个机器学习模型来执行某一特定任务&#xff08;比如图像分类&#xf…

Django - Cookie和Session

Django - Cookie和Session cookie Django中操作CookieCookie版登陆校验Session Django中Session相关方法Session流程解析Session版登陆验证Django中的Session配置Django - Cookie和Session cookie Cookie的由来 大家都知道HTTP协议是无状态的。 无状态的意思是每次请求都是独立…

一文说清AI智能平台

来源&#xff1a;海豚数据科学实验室有一天&#xff0c;小李的领导说&#xff1a;“我们要做AI平台&#xff01;”。虽然平台产品也不是新概念了&#xff0c;随着AI技术的成熟&#xff0c;AI平台产品也越来越多&#xff0c;但光凭做平台一句话&#xff0c;小李还是犯了难——大…

2D图像转3D仅需5秒,特斯拉的自动驾驶技术有救了?

来源&#xff1a;科技智谷编译&#xff1a;徐浩75年前&#xff0c;宝丽来相机拍摄出第一张即时照片&#xff0c;是人类第一次以逼真的二维图像快速捕捉三维世界&#xff0c;具有划时代的意义。今天&#xff0c;人工智能的研究人员正在进行相反的工作&#xff0c;力求在几秒钟的…

Django - 中间件

Django - 中间件 一. 什么是中间件 官方: 中间件是一个用来处理Django的请求和相应的框架级别的钩子, 他是一个轻量, 低级别的插件系统, 用于在全局范围内改变Django的输入和输出, 每个中间件都负责做一些特定的功能. 大白话: 中间件是帮助我们在视图函数执行之前和执行之后都可…

回答薛定谔问题: 生命是什么?自由能公式

来源&#xff1a;CreateAMind回答薛定谔的问题:自由能公式麦克斯韦詹姆斯德索莫拉姆斯泰德a,b,∗保罗本杰明巴德科克c,d,e,卡尔约翰弗里斯顿f,1加拿大魁北克蒙特利尔麦吉尔大学哲学系加拿大魁北克蒙特利尔麦吉尔大学精神病学系社会和跨文化精神病学分部c墨尔本大学心理科学学院…

AlphaCode能替代人类程序员吗?网友:被替代也挺好,这样就可以少写代码多开会了...

来源&#xff1a;AI前线作者&#xff1a;Ben Dickson译者&#xff1a;王强策划&#xff1a;冬梅本文属于我们的人工智能研究论文评论系列&#xff0c;这个系列旨在探讨人工智能领域的最新研究成果。DeepMind 是最新的人工智能研究实验室。它推出了一个可以生成软件源代码的深度…

Django - 内置admin

Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件&#xff0c;使用方式有&#xff1a; Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件&#xff0c;使用方式有&#xff1a;复制代码依赖APP&#xff1a;django.contrib.authdjango.contri…

Auth认证模块

Auth认证模块 本文目录 1 Auth模块是什么2 auth模块常用方法3 扩展默认的auth_user表回到目录1 Auth模块是什么 Auth模块是Django自带的用户认证模块&#xff1a; 我们在开发一个网站的时候&#xff0c;无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用…

2021年图灵奖,花落高性能计算先驱、田纳西大学教授Jack Dongarra

来源&#xff1a;智源社区“我是一个数学家&#xff0c;对我来说&#xff0c;一切都是线性代数&#xff0c;但世界也正在看到这一点,”Jack Dongarra在采访中表示。“这是我们用来建造其它东西的材料。”他说&#xff0c;机器学习和人工智能中的大多数问题都可以追溯到线性代数…

万字深度好文!视觉-语言(VL)智能:任务、表征学习和大型模型

来源&#xff1a;AI科技评论编译&#xff1a;Jocelyn编辑&#xff1a;陈彩娴本文对视觉-语言&#xff08;VL&#xff09;智能按时间顺序进行了全面调研&#xff0c;并将这一领域的发展总结为三个阶段&#xff1a;第一个阶段是2014-2018年&#xff0c;其间&#xff0c;专门的模型…

day60 BBS

BBS项目目的: 带你从头到尾把django再复习一遍 公司开发项目的流程 # 1.需求分析 客户提需求但是并不是完全按照客户需求来 产品经理和架构师开发组组长 去之前架构师和开发组组长 会提前先预想一套方案 有意识的引导客户朝着自己已经想好的解决方案上去提需求 # 2.项目设计 框…

redis笔记_源码_内存分配

文件&#xff1a;zmoalloc.h zmoalloc.c 1.求两个整数的余数 eg: 求_n对sizeof(long)的余数(_n&(sizeof(long)-1)), 性能提升为50%&#xff5e;100% 左右。 转载于:https://www.cnblogs.com/water-bear/p/11598618.html

转发,脑机接口领域又一重要成果!

来源&#xff1a;传感器技术作者&#xff1a;余淼硕士学历&#xff0c;长期从事智能传感控制、信息通信领域研究工作。“ 以脑-机交互&#xff08;BCI&#xff09;为核心的神经工程技术&#xff0c;让人类真正可以做到“心想事成”。据首都医科大学官网报道&#xff0c;首都医科…

《2022城市大脑建设标准研究报告》在京正式发布

2022年3月31号&#xff0c;《2022城市大脑建设标准研究报告》在北京正式发布&#xff0c;该报告由中国指挥与控制学会&#xff0c;中国科学院虚拟经济与数据科学研究中心&#xff0c;国家创新与发展战略研究会数字治理研究中心&#xff0c;天府大数据研究院&#xff0c;远望智库…