【一】Json
【1】介绍
JSON(javascript object otaition)是一种轻量级 的数据交换格式 JSON使用了Javascript的一部分语法来定义其数据格式,但Json是独立于语言 的 Json采用完全独立于语言的文本格式,使得Json成为理想的数据交互语言,几乎所有的现代编程语言都也有工具可以解析Json 它是一种键值对形式 的数据结构,易于人 的阅读和编写,也易于机器 的解析 Json格式的提出
【2】格式
属性名必须 使用双引号 不 能使用十六进制值不 能使用undefind不 能使用日期和函数对象
{
"name" : "John Doe" ,
"age" : 30 ,
"is_student" : false,
"subjects" : [ "Math" , "English" , "Science" ] ,
"address" : {
"street" : "123 Main St" ,
"city" : "Anytown" ,
"state" : "CA"
}
}
【3】数据格式转换
【二】Ajax
【1】介绍
(1)概念
AJAX(全称:Asynchronous JavaScript and XML,异步的Javascript和和XML) AJAX是一种无需重新加载整个页面的情况下,能够更新部分网页的技术 简单说:AJAX是一种用于创动态网页的编程技术 这意味着网页再被用户查看和交互的同时,可以与服务器进行数据交换和页面更新。 尽管名字中含有XML,但是在实践中,数据格式通常是JSON ,并非XML 简单的将:异步交互 、局部刷新
(2)大致工作原理
用户在浏览器进行操作(例如:点击一个按钮) Javascript创建一个XMLHttpRequest对象,然后向服务器发送请求 服务器处理这个请求 服务器将响应发送回网页 Javascript读取响应,然后对网页进行响应的更新
关键:
关键是XMLHttpRequest对象 这个对象是AJAX的主要接口,他提供了浏览器和服务器之间的进行异步通信的能力 请求方式
(3)请求方式小结
浏览器地址输入URL回车:GET请求 a标签的跳转:GET请求 form表单:既可以GET也可以POST AJAX:既可以GET也可以POST
【2】加法案例
(1)前端
<! DOCTYPE html >
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< title> Title</ title>
< meta name = " viewport" content = " width=device-width,initial-scale=1.0" >
< script src = " https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js" > </ script>
< link rel = " stylesheet" href = " https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" >
< script src = " https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" > </ script>
</ head>
< body>
< div> number_one: < input type = " text" id = " num1" > </ div>
< div> number_two: < input type = " text" id = " num2" > </ div>
< div> result: < input type = " text" id = " result" > </ div>
< button id = " btn_result" > 求和计算</ button>
< script>
{ #等待页面加载完毕#}
$ ( document) . ready (
{ #给按钮绑定事件#}
$ ( "#btn_result" ) . click ( function ( ) {
{ #异步触发AJAX #}
$. ajax (
{
{ #提交数数据路径, 和action一样#}
url : "" ,
{ #提交方式#}
type : "post" ,
{ #表示期望从数据库返回的数据类型(json、xml、script、html)#}
dataType : "json" ,
{ #提交给后端的数据, 键值可以直接写#}
data : {
number1 : $ ( "#num1" ) . val ( ) ,
"number2" : $ ( "#num2" ) . val ( )
} ,
{ #回调函数,data是后端返回的数据#}
success : function ( data ) {
console. log ( data, typeof data )
{ #102 string#}
$ ( "#result" ) . val ( data)
}
}
)
} )
)
</ script>
</ body>
</ html>
(2)后端
from django. shortcuts import render, HttpResponse, JsonResponse
def home ( request) :
if request. method == "POST" :
data = request. POST
print ( data)
num1 = data. get( "number1" )
num2 = data. get( "number2" )
result = int ( num1) + int ( num2)
return HttpResponse( result)
return JsonResponse( result)
return render( request, 'home.html' )
(3)不同方式数据返回
< script>
{ #等待页面加载完毕#}
$ ( document) . ready (
{ #给按钮绑定事件#}
$ ( "#btn_result" ) . click ( function ( ) {
{ #异步触发AJAX #}
$. ajax (
{
{ #提交数数据路径, 和action一样#}
url : "" ,
{ #提交方式#}
type : "post" ,
{ #表示期望从数据库返回的数据类型(json、xml、script、html)#}
dataType : "json" ,
{ #提交给后端的数据, 键值可以直接写#}
data : {
number1 : $ ( "#num1" ) . val ( ) ,
"number2" : $ ( "#num2" ) . val ( )
} ,
{ #回调函数,data是后端返回的数据#}
success : function ( data ) {
console. log ( data, typeof data )
{ #{ message : 'OK' , result : 7712 } #}
{ # 'object' #}
$ ( "#result" ) . val ( data. result)
}
}
)
} )
)
</ script>
def home ( request) :
if request. method == "POST" :
data = request. POST
print ( data)
num1 = data. get( "number1" )
num2 = data. get( "number2" )
res = {
"message" : "OK" ,
"result" : int ( num1) + int ( num2)
}
return JsonResponse( res)
return render( request, 'home.html' )
【三】前后端传输数据的编码格式(contentType)
由于get请求数据是直接放在url后面的
url?username=bruce&password=123 所以主要研究POST请求
【1】urlencoded
application/x-www-form-urlencoded(urlencoded)
这是最常见 的POST数据提交的方式。 浏览器的原生 <form>
表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded
方式提交数据。 键值对 都是通过**&符号分隔,键值之间等号( =**)连接。
例如:key1=value1&key2=value2
。
【2】formdata
multipart/form-data(formdata)
这种数据格式通常用于文件上传 。 当表单中包含 <input type="file">
时,就需要使用这种格式来提交表单。
【3】json
application/json(json)
这种数据格式用于发送 JSON 格式的数据。 在现代的Web应用中,这种格式越来越常见,特别是在构建 RESTful API 时。 form表单没有这种格式
【4】plain
【四】AJAX传输数据编码格式
【1】request补充
(1).body
在 Django 中,request.body
属性包含了 HTTP 请求的原始内容 ,它通常用于处理非表单数据的 POST 请求。
比如,当发送 JSON、XML 或者其他类型的数据时,你会使用 request.body
来获取这些数据。 request.body
返回的是一个字节字符串
所以如果你发送的是 JSON 数据,你需要使用 Python 的 json
模块来解析 这个字节字符串 需要注意的是,request.body
只能被读取一次
因为它是从 socket 读取的,读取后数据就会被清空 。 如果试图多次读取 request.body
,你会得到一个空的字节字符串。 如果需要多次使用请求的数据,你需要将它保存到一个变量中。 要使用尽量放在最千面
(2).is_ajax()
【2】默认格式
(1)前端界面
< button class = " btn btn=success" id = " b1" > Click</ button>
< script>
$ ( document) . ready (
$ ( "#b1" ) . click ( function ( ) {
$. ajax ( {
url : "" ,
type : "post" ,
data : { "username" : "bruce" , "password" : "123" } ,
success : function ( args ) {
} }
)
} )
)
</ script>
(2)后端
def home ( request) :
body = request. body
print ( body, type ( body) )
if request. method == "POST" :
data = request. POST
print ( data, type ( data) )
return render( request, 'home.html' )
(3)结果
默认值是 'application/x-www-form-urlencoded; charset=UTF-8'
,这表示数据是以表单的形式提交的。
特殊的字符串 类型 编码方式将每个键值对(key-value pair)转换为key=value
的形式,并使用&
符号连接多个键值对。
【3】Json格式
(1)前端页面
< button class = " btn btn=success" id = " b1" > Click</ button>
< script>
$ ( document) . ready (
$ ( "#b1" ) . click ( function ( ) {
$. ajax ( {
url : "" ,
type : "post" ,
contentType : "applications/json" ,
data : JSON . stringify ( { "username" : "bruce" , "password" : "123" } ) ,
success : function ( args ) {
} }
)
} )
)
</ script>
(2)后端
def home ( request) :
body = request. body
print ( body, type ( body) )
if request. method == "POST" :
data = request. POST
print ( data, type ( data) )
if body:
json_str = body. decode( 'utf-8' )
json_dict = json. loads( json_str)
print ( json_dict, type ( json_dict) )
return render( request, 'home.html' )
b'{"username":"bruce","password":"123"}' < class 'bytes' >
< QueryDict: { } > < class 'django.http.request.QueryDict' >
{ 'username' : 'bruce' , 'password' : '123' } < class 'dict' >
(3)结果
【4】文件格式
(1)前端界面
< p> username: < input type = " text" id = " d1" name = " username" > </ p>
< p> username: < input type = " password" id = " d2" name = " password" > </ p>
< p> file: < input type = " file" id = " d3" name = " file" > </ p>
< button class = " btn btn-success" id = " b1" > submit</ button>
< script>
$ ( "#b1" ) . on ( 'click' , function ( ) {
{ #传输文件需要内置对象formdata#}
let formDataObj = new FormData ( ) ;
formDataObj. append ( 'username' , $ ( "#d1" ) . val ( ) ) ;
formDataObj. append ( 'password' , $ ( "#d2" ) . val ( ) ) ;
formDataObj. append ( 'file' , $ ( "#d3" ) [ 0 ] . files[ 0 ] ) ;
$. ajax ( {
url : "" ,
type : "post" ,
data : formDataObj,
{ #不需要使用任何编码,django后端能自动识别formdate对象#}
contentType : false ,
{ #告诉浏览器不要对我的数据进行处理#}
processData : false ,
success : function ( args ) {
}
} )
} )
</ script>
(2)后端
def home ( request) :
if request. is_ajax( ) and request. method == "POST" :
print ( request. POST)
print ( request. FILES)
return render( request, 'home.html' )
(3)结果
想要传输文件需要
javascript内置对象
formdata 可以通过append方法 添加在键值对 文件内容在$("#d1")[0].files[0]
中 两个配置
不使用任何编码contentType: false
,后端自动识别formdata 不对数据进行任何处理:processData: false
后端可以通过is_ajax和post一起来判断
是否是ajax的post请求 文件在request.FILES
中 其他键值对在request.POST
中
【五】sweetleart
【1】官网
(1)sweetleart1
< script src = " https://unpkg.com/sweetalert/dist/sweetalert.min.js" >