5.Ajax

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.Ajax相关的知识,希望对你有一定的参考价值。

1.Ajax简介
AJAX(Asynchronous javascript And Xml--异步Javascript和XML。)
是使用javascript语言与服务器进行异步交互,传输的数据不止为XML,使用更多的是json数据。

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

Ajax特点:
1.使用javascript技术向服务器发送异步请求。
2.局部页面刷新。

1.1ajax请求过程

技术图片

2.ContentType

1.application/x-www-form-urlencoded
这是POST提交默认的方式。form表单如果不设置enctype属性,那么会以application/x-www-form-urlencoded方式提交数据。

2.multipart/form-data
使用表单上传文件时,form表单的enctype一定要是multipart/form-data

3.application/json
告诉服务端消息主体是序列化后的JSON字符串。
浏览器端序列化JSON的方法JSON.stringify(),反序列化的方法JSON.parse()。
json格式支持多种结构化的数据。

技术图片

技术图片

技术图片

3.Ajax提交数据

3.1get请求

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
    </title>
    <script type="text/javascript" src="/static/jquery-3.3.1.js"></script>
</head>
<body>
<input type="button" value="AJAX_GET" id="ajax_get">

</body>
<script type="text/javascript">
    $("#ajax_get").click(
        function () 
            $.ajax(
                url:"/ajax_get/",
                type:"get",
                data:
                    a:1,
                    b:2
                ,
                success:function (data) 
                    console.log(data)
                
            )
        
    )
</script>
</html>

views.py

from django.shortcuts import render,HttpResponse

def index(request):

    return render(request, "index.html")

def ajax_get(request):
    # ajax中的数据放置在request.GET中,通过request.GET.get("a")获取数据
    print(request.GET)  # <QueryDict: ‘a‘: [‘1‘], ‘b‘: [‘2‘]>
    print(type(request.GET))  # <class ‘django.http.request.QueryDict‘>
    print(request.GET.get("a"))  # 1
    print(request.GET.get("b"))  # 2
    return HttpResponse("ajax_get")

urls.py

from django.contrib import admin
from django.urls import path, register_converter
from app1 import views,converters
register_converter(converters.YearConverter,"int_con")
urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path("index/", views.index),
    path("ajax_get/", views.ajax_get),
]

技术图片
技术图片

3.2post请求

print(request.body)  # b‘a=1&b=2‘,请求报文中的请求体,只有post请求时,请求体中才有内容
print(request.POST)  # <QueryDict: ‘a‘: [‘1‘], ‘b‘: [‘2‘]>,只有contentType==urlencoded(默认是urlencode)时,request.POST才有值
# 虽然request.body中有内容,但是不方便获取值,需要自己手动进行解析,所以在默认contentType下,都使用request.POST方式获取值。
# 当contentType:"application/json"时,request.POST中无数据,可以取request.body中的值,然后json.loads()解析。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
    </title>
    <script type="text/javascript" src="/static/jquery-3.3.1.js"></script>
</head>
<body>
<input type="text" id="n1">+<input type="text" id="n2">=<input type="text" id="n3">
<input type="button" value="cal" id="ajax_post">

</body>
<script type="text/javascript">
    $("#ajax_post").click(
        function () 
            $.ajax(
                url:"/ajax_post/",
                type:"post",
                data:
                    a:$("#n1").val(),
                    b:$("#n2").val()
                ,
                success:function (data) 
                    #给第三个input框设置值#
                    $("#n3").val(data)
                
            )
        
    )
</script>
</html>

views.py

from django.shortcuts import render,HttpResponse

def index(request):

    return render(request, "index.html")

def ajax_post(request):

    print(request.body)  # b‘a=1&b=2‘,请求报文中的请求体,只有post请求时,请求体中才有内容
    print(request.POST)  # <QueryDict: ‘a‘: [‘1‘], ‘b‘: [‘2‘]>,只有contentType==urlencoded(默认是urlencode)时,request.POST才有值
    # 虽然request.body中有内容,但是不方便获取值,需要自己手动进行解析,所以在默认contentType下,都使用request.POST方式获取值。
    a = int(request.POST.get("a"))
    b = int(request.POST.get("b"))
    ret = a+b
    return HttpResponse(ret)

urls.py


from django.contrib import admin
from django.urls import path, register_converter
from app1 import views,converters
register_converter(converters.YearConverter,"int_con")
urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path("index/", views.index),
    path("ajax_post/", views.ajax_post),
]

技术图片
技术图片
技术图片

3.3post请求--前端发送json,后端解析;后端发送json,前端解析

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
    </title>
    <script type="text/javascript" src="/static/jquery-3.3.1.js"></script>
</head>
<body>
<form>
    用户名 <input type="text" id="user">
    密码  <input type="password" id="pwd">
    <input type="button" value="submit" class="login_btn"><span class="error"></span>
</form>

</body>
<script type="text/javascript">
    $(".login_btn").click(
        function () 
            $.ajax(
                url:"/login/",
                type:"post",
                contentType:"application/json",//发送接送数据的时候,格式一定要是contentType:"application/json"
                data:JSON.stringify(
                    user:$("#user").val(),
                    pwd:$("#pwd").val()
                ),
                success:function (data) 
                    console.log(data);//json字符串,"user": "vita", "msg": null
                    console.log(typeof(data)); //string
                    #解析views.py中传过来的json数据#
                    let par_data = JSON.parse(data);
                    console.log(par_data);//user: "vita", msg: null
                    console.log(typeof(par_data));//object
                    if(par_data.user)
                        console.log(par_data.user)//vita
                    else 
                        $(".error").html(par_data.msg).css("color","red")
                    
                
            )
        
    )
</script>
</html>

views.py

from django.shortcuts import render,HttpResponse
import json
def index(request):

    return render(request, "index.html")

def login(request):
    print("request.body----", request.body)  # b‘"user":"vita","pwd":"123"‘只能从request.body中获取数据
    print("request.POST----", request.POST)  # <QueryDict: >,contentType:"application/json"----此时request.POST中无数据
    data = json.loads(request.body)  # 反序列化json数据
    print(data)  # ‘user‘: ‘vita‘, ‘pwd‘: ‘123‘
    print(type(data))  # <class ‘dict‘>
    user = data.get("user")
    pwd = data.get("pwd")
    res = "user": None, "msg": None
    if user == "vita" and pwd == "123":
        res["user"] = user
    else:
        res["msg"] = "username or password is not correct!"
    #     转换为json字符串,发送到前端
    return HttpResponse(json.dumps(res))

urls.py


from django.contrib import admin
from django.urls import path, register_converter
from app1 import views,converters
register_converter(converters.YearConverter,"int_con")
urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path("index/", views.index),
    path("login/", views.login),
]

技术图片
技术图片
技术图片
技术图片

3.4post请求--views.py中返回json数据到前端

views.py中
json.dumps(res)
html中
JSON.parse()

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
    </title>
    <script type="text/javascript" src="/static/jquery-3.3.1.js"></script>
</head>
<body>
<form>
    用户名 <input type="text" id="user">
    密码  <input type="password" id="pwd">
    <input type="button" value="submit" class="login_btn"><span class="error"></span>
</form>

</body>
<script type="text/javascript">
    $(".login_btn").click(
        function () 
            $.ajax(
                url:"/login/",
                type:"post",
                data:
                    user:$("#user").val(),
                    pwd:$("#pwd").val()
                ,
                success:function (data) 
                    console.log(data);//json字符串,"user": "vita", "msg": null
                    console.log(typeof(data)); //string
                    #解析views.py中传过来的json数据#
                    let par_data = JSON.parse(data);
                    console.log(par_data);//user: "vita", msg: null
                    console.log(typeof(par_data));//object
                    if(par_data.user)
                        console.log(par_data.user)//vita
                    else 
                        $(".error").html(par_data.msg).css("color","red")
                    
                
            )
        
    )
</script>
</html>

views.py

from django.shortcuts import render,HttpResponse
import json
def index(request):

    return render(request, "index.html")

def login(request):

    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    res = "user":None,"msg":None
    if user=="vita" and pwd=="123":
        res["user"]=user
    else:
        res["msg"]="username or password is not correct!"
    #     转换为json字符串,发送到前端
    return HttpResponse(json.dumps(res))

urls.py


from django.contrib import admin
from django.urls import path, register_converter
from app1 import views,converters
register_converter(converters.YearConverter,"int_con")
urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path("index/", views.index),
    path("login/", views.login),
]

技术图片
技术图片

3.5form表单上传文件

"request.FILES对象获取文件的相关内容"
print("request.POST----", request.POST)  # request.POST---- <QueryDict: ‘user‘: [‘vita‘]>
    print("request.FILES----", request.FILES)  # request.FILES---- <MultiValueDict: ‘avatar‘: [<InMemoryUploadedFile: baby.jpg (image/jpeg)>]>
    if request.method == "POST":
        file_obj = request.FILES.get("avatar")
        with open(file_obj.name, "wb") as f:
            for line in file_obj:
                f.write(line)

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
    </title>
    <script type="text/javascript" src="/static/jquery-3.3.1.js"></script>
</head>
<body>
<h3>基于form表单的文件上传</h3>

<form action="/login/" method="post" enctype="multipart/form-data">
     用户名<input type="text" name="user"><!--这里是根据name来获取key的-->
     头像  <input type="file" name="avatar">
    <input type="submit">
</form>

</body>
<script type="text/javascript">

</script>
</html>

views.py

from django.shortcuts import render,HttpResponse
import json
def index(request):

    return render(request, "index.html")

def login(request):
    print("request.body----", request.body)
    print("request.POST----", request.POST)  # request.POST---- <QueryDict: ‘user‘: [‘vita‘]>
    print("request.FILES----", request.FILES)  # request.FILES---- <MultiValueDict: ‘avatar‘: [<InMemoryUploadedFile: baby.jpg (image/jpeg)>]>
    if request.method == "POST":
        file_obj = request.FILES.get("avatar")  # 这里是html中input的name
        with open(file_obj.name, "wb") as f:
            for line in file_obj:
                f.write(line)

    return HttpResponse("OK")

技术图片
技术图片

3.6ajax上传文件

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
    </title>
    <script type="text/javascript" src="/static/jquery-3.3.1.js"></script>
</head>
<body>
<h3>基于ajax文件上传</h3>

<form action="" method="post">
     用户名<input type="text" id="user">
     头像  <input type="file" id="avatar">
    <input type="button" class="btn" value="提交">
</form>

</body>
<script type="text/javascript">
$(".btn").click(function () 
    let formdata = new FormData();
    formdata.append("user",$("#user").val());
    console.log("$(\"#avatar\")[0]----",$("#avatar")[0]);
    console.log("$(\"#avatar\")[0].files----",$("#avatar")[0].files);
    console.log("$(\"#avatar\")[0].files[0]----",$("#avatar")[0].files[0]);
    formdata.append("avatar",$("#avatar")[0].files[0]);
    $.ajax(
        url:"/login/",
        type:"post",
        data:formdata,
        contentType:false,// 不处理数据
        processData:false,// 不设置内容类型
        success:function (data) 
            console.log(data)
        
    )
)
</script>
</html>

views.py

from django.shortcuts import render,HttpResponse
import json
def index(request):

    return render(request, "index.html")

def login(request):
    print("request.body----", request.body)
    print("request.POST----", request.POST)  # request.POST---- <QueryDict: ‘user‘: [‘vita‘]>
    print("request.FILES----", request.FILES)  # request.FILES---- <MultiValueDict: ‘avatar‘: [<InMemoryUploadedFile: baby.jpg (image/jpeg)>]>
    if request.method == "POST":
        file_obj = request.FILES.get("avatar")
        with open(file_obj.name, "wb") as f:
            for line in file_obj:
                f.write(line)

    return HttpResponse("OK")

技术图片
技术图片
技术图片

以上是关于5.Ajax的主要内容,如果未能解决你的问题,请参考以下文章