Ajax
例子:github注册页面
-
异步提交,提交以后不等待
-
局部刷新
| 向后端发送请求的方式 | 什么请求 |
|---|---|
| 浏览器地址栏输入url回车 | GET |
| a标签的href属性 | GET |
| form表单 | GET/POST |
| Ajax | GET/POST |
学jQuery封装之后的版本,在前端页面使用ajax的时候需要确保导入了jQuery
回调函数不会自动反序列化后端用HttpResponse返回的数据,会自动反序列化后端用JsonResponse返回的数据,
在前端手动反序列化HttpResponse返回的数据的方式
- JSON.parse()
- 在ajax配置一个参数dataType:true,自动反序列化(老师演示失败)
#后端
def ab_ajax(request):
if request.method == 'POST':
i1 = request.POST.get('i1')
i2 = request.POST.get('i2')
i3 = int(i1) + int(i2)
dict = {'code': 100, 'msg': i3}
#方式一
# return HttpResponse(json.dumps(dict))
#方式二
return JsonResponse(dict)
return render(request, 'ajax.html')
#ajax基本语法
$('#d4').click(function (){
$.ajax({
{## 1.指定向哪个后端发送ajax请求}#}
url:'',
{#2.请求方式#}
type:'post',
{#3.数据#}
data:{'i1':$('#d1').val(),'i2':$('#d2').val()},
{#4.回调函数:当后端返回结果的时候会自动触发该函数#}
{#后端返回的结果不在直接作用于浏览器,而是给到回调函数,由args参数接收#}
{#dataType:true,加了报错#}
success:function (args){
#方式一,通过HttpResponse返回的数据,要手动反系列化
{#dic=JSON.parse(args)#}
{#$('#d3').val(dic.msg)#}
#方式二,通过JsonResponse返回的结果,在前端自动反序列化成Object对象
$('#d3').val(args.msg)
}
})
})
前后端传输数据的编码格式
主要研究post请求数据的编码格式,get请求数据是直接放在url里面的问号后面的,格式:name=jason&age=18
前端向后端发送post请求的方式:
1.form表单
2.ajax
form表单
默认的数据编码格式是urlencoded,数据格式:name=jason&age=18
django后端对符合urlencoded编码格式的数据,会自动解析封装到request.POST中
如果编码格式为:formdata,会把普通的键值对封装到request.POST中,把文件封装到request.FILES中
form表单不能发送json格式数据
ajax
默认的数据编码格式是urlencoded,数据格式:name=jason&age=18
ajax发送json格式数据
request.is_ajax() #用于判断当前请求是否是ajax请求
<body>
<button id="d1" >提交</button>
<script>
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
data:JSON.stringify({'name':'jason','age':18}),
//dataType:'JSON',
{#指定传输数据的编码格式#}
contentType:'application/json',
success:function(args){
}
})
})
</script>
</body>
django后端对json格式数据不会做任何处理,通过request.body来获取
def ajax_json(request):
if request.is_ajax():
json_bytes=request.body
print(json_bytes)
# 方式一,手动解码,然后反序列化
json_str=json_bytes.decode('utf-8')
print(json_str)
dict=json.loads(json_str)
# 方式二
#json.loads()内部识别到二进制数据后,会自动解码,然后反序列化
# dict=json.loads(json_bytes)
print(dict)
return render(request,'ajax_json.html')
'''
b'{"name":"jason","age":18}'
{"name":"jason","age":18}
{'name': 'jason', 'age': 18}
'''
ajax发送文件数据
需要利用内置对象FormData,既可以发普通键值对,又可以发文件
<body>
name:<input type="text" id="d1">
age:<input type="text" id="d2">
<input type="file" id="d3">
<button id="d4">提交</button>
<script>
$('#d4').on('click',function () {
let formDataObj=new FormData()
formDataObj.append('name',$('#d1').val())
formDataObj.append('age',$('#d2').val())
//
formDataObj.append('myfile',$('#d3')[0].files[0])
$.ajax({
url:'',
type:'post',
data:formDataObj,
//不使用任何编码,django后端能够自动识别FormData对象
contentType:false,
//告诉浏览器不要对数据进行任何处理
processData:false,
success:function () {
}
})
})
</script>
</body>
django后端能够自动识别FormData对象
def ajax_file(request):
if request.is_ajax():
if request.method=='POST':
print(request.POST)
print(request.FILES)
return render(request, 'ajax_file.html')
'''
<QueryDict: {'name': ['aa'], 'age': ['18']}>
<MultiValueDict: {'myfile': [<InMemoryUploadedFile: 杂.txt (text/plain)>]}>
'''
批量插入
# 每次插入一条数据
for i in range(1000):
models.Book.objects.create(book_name='第%s本书'%i)
#批量将数据插入数据库
book_list=[]
for i in range(1000):
# 这里没有操作数据库
book_obj=models.Book(book_name='第%s本书'%i)
book_list.append(book_obj)
# 这里一次性操作数据库
models.Book.objects.bulk_create(book_list)
浙公网安备 33010602011771号