Ajax发送请求的特点是不刷新页面,很常用
实现方式:使用 浏览器中的XmlHttpRequest
对象来完成请求
优点:不依赖插件,直接快捷
缺点:代码叫复杂,并且有的低版本浏览器不支持
url关系:
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
path('ajax1/', views.ajax1),
]
views函数:
def index(request):
return render(request,"ajax1.html")
def ajax1(request):
return HttpResponse("这是原生Ajax")
html文件
<h1>这是原生Ajaxh1>
实现方式:用JavaScript的类库jQuery对浏览器对象XMLHttpRequest 或 ActiveXObject做好了上层封装
优点:简单快捷
缺点:依赖插件,影响性能
<h1>这是Jquery下的ajaxh1>
实现方式:html里的iframe标签和form表单
优点:兼容性最好
缺点:暂无
<h1>这是伪ajaxh1>
<iframe id="iframe" name="ifra" style="display: none">iframe>
<form action="/ajax3" method="post" target="ifra">
<input type="text" name="name">
<input type="submit" value="t提交">
form>
<script>
document.getElementById("iframe").onload=function () {
//后台返回数据后,iframe标签里重新生成一个hlml,数据在html的body标签里
var ele=this.contentWindow.document.body.innerHTML; //取到iframe标签的内容
//$(this).contents().find("body").text() jQurey方式查找
var data=JSON.parse(ele) //依照需求反序列化
if(data.status){
alert(data.message)
}else{
alert("发送失败")
}
}
script>
以上提交的都是字符串,字典里面套字典需要序列化。那么如果是文件呢?
首先在form表单放入<input type="file">
,form表单直接打包处理,
那伪类ajax就自然解决了
那剩下的两种方式怎么做呢?
它们两个是一样的,都是需要借助FormData对象
原生Ajax上传文件:
<h1>这是原生Ajaxh1>
<input type="file" id="img">
jQuery下的ajax上传文件:
<h1>这是Jquery下的ajaxh1>
<input type="file" id="img">
用FormData对象作为数据传递,记得加上两个参数 processData: false
, contentType: false,
改为false
小总结:
1.没有form表单的封装,需要用FormData对象来上传文件,当然只上传数据也可以用
2.FormData对象中添加数据:append("键名":键值)
3.获取到文件的方式:$("#img").files[0]
再补充一个后台接收到文件保存到本地方法:
def ajax1(request):
print(request.GET)
print(request.POST)
print(request.FILES)
file=request.FILES.get("k3")
print(file.name)
print(file.size)
f=open(file.name,"wb")
for line in file.chunks:
f.write(line)
f.close()
return HttpResponse("这是原生Ajax")
**
**
思路:标签内容发生变化后,自动上传到后台,后台接收到之后存到本地,把路径再发给前端
HTML部分:
<h1>这是伪ajaxh1>
<iframe id="iframe" name="ifra" style="display: none">iframe>
后台部分:
def ajax3(request):
import os,uuid,json
nid=str(uuid.uuid4()) #随机产生一段字符串
req = {"status": True, "path":None,"message": "伪ajax"}
file = request.FILES.get("k3")
file_path=os.path.join("static",nid+file.name)
f = open(file_path, "wb")
for line in file.chunks():
f.write(line)
f.close()
req["path"]=file_path
return HttpResponse(json.dumps(req))