Django之AJAX传输JSON数据

AJAX 中 JSON 数据传输:

AJAX请求JSON类型数据:

  • AJAX通过GET或者POST方式都可以发送JSON数据请求,需要指定内容类型:‘Content-Type':'application/json',post请求必须设置

  • headers :{ 'X-CSRFToken' : $ ( ' input [ name =csrfmiddlewaretoken]' ).val()},在请求头部进行csrf认证;

  • 请求数据data经过 JSON .stringify()进行序列化

  • AJAX在前端发送的JSON数据,django不能自动解析,因此request.GET或request.POST都为空,JSON数据在请求体request.body中需要手动解析(解码反序列化)。

django响应JSON类型数据:

django视图函数通过 import json导入模块,对数据需要返回的数据进行json.dumps()序列化

AJAX 请求 JSON 类型数据:

以post请求为例,get请求不需要csrf认证,故不需要JSON数据请求的headers信息

login.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<title>login</title>
</head>
<body>
<div>
用户名:<input type="text" name="username" id="username">
密码:<input type="password" name="password" id="password">
<input type="button" id="submit" value="提交">{% csrf_token %}
<span id="status"></span>
</div>
</body> <script>
//以post方式请求
$(function () {
$('#submit').click(function () { $.ajax({
url: "{% url 'auth' %}",//请求路径
type: 'post', //请求方式 //(1)默认数据请求
//data: { //请求数据(post请求的csrf认证键值对固定)
// username: $('#username').val(),
//password: $('#password').val(),
//csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
//}, //(2)JSON数据请求
'Content-Type':'application/json',
headers:{'X-CSRFToken': $('input[name=csrfmiddlewaretoken]').val()},//在请求头通过csrf认证,键固定
data:JSON.stringify({
username: $('#username').val(),
password: $('#password').val(),
}), success: function (response) {//请求回调函数
if (response == 1) {
location.href = "{% url 'index' %}"
} else {
$('#status').text('账号或密码有误!')
}
}
})
})
}); </script>
</html>

urls.py

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/',views.login,name='login'),
url(r'^auth/',views.auth,name='auth'),
url(r'^index/',views.index,name='index'),
]

views.py

def auth(request):
if request.method == 'POST':
#(1)默认数据请求
# name = request.POST.get('username')
# psd = request.POST.get('password') #(2)JSON数据请求
request_data=request.body
print(request_data)
request_dict=json.loads(request_data.decode('utf-8'))
name=request_dict.get('username')
psd=request_dict.get('password') if name == "yang" and psd == '123':
status = 1
else:
status = 0
return HttpResponse(status)

django 响应 JSON 类型数据:

AJAX中回调函数接收到的数据都为string字符串类型,因此在视图函数响应的原始数据只有字符串类型的才能被AJAX正常接收,其它的数据类型(数字,列表,字典等)都必须通过json数据类型进行传输

(1)视图函数响应字符串,AJAX正常接收,其否则响应的其它数据类型也都是string无法解析使用:

  

( 2 )视图函数响应 JSON 数据类型:

  • 使用HttpResponse响应手动序列化后JSON数据直接响应,前端得到的响应数据需要被动反序列化成对应的数据类型

  • 使用HttpResponse响应手动序列化后JSON数据并设置参数content_type= 'application/json' 前端得到的响应数据是经过JSON对象自动进行反序列化后的对应数据类型

  • 使用HttpResponse响应不需要手动序列化JSON数据,直接响应即可,但是对于非字典类型的数据类型需要设置参数safe= False , 前端得到的响应数据是经过JSON对象自动进行反序列化后的对应数据类型

①使用HttpResponse响应:未告知类型,前端需要被动解析

视图函数:

data={ 'status' :[1,2,3], 'info' : 'login' }

 return  HttpResponse(json.dumps(data)) #  直接发送  json  字典,前端需要被动反序列化

AJAX回调函数:

success:  function  (response) { //  请求回调函数参数response被动反序列化 

     console .log( JSON .parse(response));

     console .log( typeof   JSON .parse(response));

②使用HttpResponse响应,告知类型,前段自动调用JSON对象解析

视图函数:

data={ 'status' :[1,2,3], 'info' : 'login' }

 return  HttpResponse(json.dumps(data),content_type= 'application/json' ) #  发送  json  字典,告知类型

return HttpResponse(json.dumps(ret,ensure_ascii=False)) #ensure_ascii=False 是告诉json不要对中文进行编码,不然返回给前端的数据中如果有中文的话会被编码成unicode类型的数据,导致前端看不到中文

AJAX回调函数:

success:  function  (response) { //  请求回调函数参数response自动反序列化 

     console .log(response);

     console .log( typeof  response);

③ 使用 JsonResponse 响应,不需要手动进行序列化,同时也不需要告知类型,在响应除字典以外的数据类型时,需要添加参数safe=False

from  django.http  import  JsonResponse

响应字典视图函数:

data={'status':[1,2,3],'info' *'l in' }
return Json sponse(data) # 使用 JsonResponse, 直接响应数据 响应非字典视图函数: data=[{ 'status' :[1,2,3], 'info' : 'login' }] return JsonResponse(data,safe= False ) # 使用 JsonResponse, 直接相应数据 , 字典以外数据类型徐设置参数 safe=False

AJAX回调函数:

success:  function  (response) { //  请求回调函数参数response自动反序列化 

     console .log(response);

     console .log( typeof  response);

Django之AJAX传输JSON数据的更多相关文章

  1. Ajax应用-Ajax传输JSON数据实例

    ———————————————————— <script type="text/javascript">            var client;          ...

  2. [JSON] 前后台如何通过$.ajax()传输JSON数据

    说明:slesecByPriomaryKey是通过empno来获得Emp对象. 前台1: $(function() { $.ajax({ type : "POST", url : ...

  3. python 全栈开发,Day75(Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件)

    昨日内容回顾 基于对象的跨表查询 正向查询:关联属性在A表中,所以A对象找关联B表数据,正向查询 反向查询:关联属性在A表中,所以B对象找A对象,反向查询 一对多: 按字段:xx book ----- ...

  4. Django与Ajax,文件上传,ajax发送json数据,基于Ajax的文件上传,SweetAlert插件

    一.Django与Ajax AJAX准备知识:JSON 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻 ...

  5. Django--多对多表的创建、contentType、ajax、ajax传输json数据格式、ajax传输文件数据、 自定义分页器

    MTV与MVC(了解): MTV模型(Django用的就是MTV): M:模型层(models.py) T:templates C:views MVC模型: M:模型层(models.py) V:视图 ...

  6. 通过ajax和spring 后台传输json数据

    在通过ajax从页面向后台传数据的时候,总是返回415(Unsupported media type)错误,后台无法获取数据.如下图所示: 在尝试解决这个问题的时候,我们首先要理解一下概念: @req ...

  7. Springboot+ajax传输json数组以及单条数据的方法

    Springboot+ajax传输json数组以及单条数据的方法 下面是用ajax传输到后台单条以及多条数据的解析的Demo: 结构图如下: 下面是相关的代码: pom.xml: <?xml v ...

  8. Ajax传递json数据简介和一个需要注意的小问题

    Ajax传递json数据 Ajax操作与json数据格式在实际中的运用十分广泛,本文为大家介绍一个两者相结合的小案例: 项目结构 我们新建一个Django项目,在里面创建一个名为app01的应用: p ...

  9. Ajax(form表单文件上传、请求头之contentType、Ajax传递json数据、Ajax文件上传)

    form表单文件上传 上菜 file_put.html <form action="" method="post" enctype="multi ...

随机推荐

  1. TTTTTTTTTTTTT CF Good Bye 2015 C- New Year and Domino(CF611C) 二维前缀

    题目 题意:给你一个n*m由.和#组成的矩阵,.代表可以放,#代表不可以,问在左上角(px,py)到(右下角qx,qy)这样的一个矩阵中,放下一个长度为2宽度为1的牌有多少种放法: #include ...

  2. git branch查看不到分支的名字解决办法

    git branch查看不到分支的名字解决办法 <!-- 1. 先初始化 --> git init; <!-- 2. 接着创建瑶瑶的专属分支 --> git checkout ...

  3. unittest详解(六) 断言

    我们在执行测试用例时,怎么来判断这条用例是否通过呢?唯一的办法就是拿实际结果和预期结果进行比较,如果一致用例就是通过的,否则用例就是失败的.在python中这种比较的方法就叫做断言,unittest框 ...

  4. BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...

  5. python学习之路(18)

    返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: >>> def a(* ...

  6. JavaWeb--Servlet 详解

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互.这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求后 ...

  7. jsPDF生成pdf文件和中文编码

    jsPDF的简单使用以及中文编码问题的解决 文中js通过CDN引入,若是为了加载时间最好下载至本地. jsPDF的使用 jsPDF简介 jsPDF 是一个基于 HTML5 的客户端解决方案,用于在客户 ...

  8. HTMLHint 配置文件

    HTMLHint 工具可以对 HTML 代码做静态代码检查,从而保证 HTML 代码的规范和质量.HTMLHint 工具内置 23 条规则,建议在 .htmlhintrc 配置文件中将规则尽可能都打开 ...

  9. 函数-this

    1.this. 解析器在调用函数的时候,每次都会向函数内部传递进一个隐含的参数(即this): this指向一个对象,这个对象称为函数执行的上下文对象.根据函数的调用方式的不同,this会指向不同的对 ...

  10. winform Timer控件的使用

    private void button1_Click(object sender, EventArgs e){ Timer timer1 = new Timer(); timer1.Interval ...