ajax 介紹,ajax的請求通過js中的 xmlHttpRequest對象完成


ajax (Asynchronous JavaScript And XMl)  異步JavaScript和xml,傳輸的數據是xml,現在是json數據,

使用JavaScript與

同步交互:發出一個請求,等待服務器響應結束,才能發出第二個請求

異步交互:發出一個請求,無需等待服務器響應解除,就可以發出第二個請求。

ajax的特點:異步,和局部刷新

json對象,值的都是字符串,在js的對象,

如:在python語言和PHP語言傳輸數據,是需要一個解析器的,json字符串存的就是字符串,不需要解析器,

 

優點:局部刷新性能高,異步請求,

缺點:不適合所有場景,有時用到同步交互,

  請求次數過多,增大服務器壓力,

  ajax是使用JavaScript技術實現的,還需要處理瀏覽器的兼容問題,

 

ajax的核心是在JavaScript中添加一個  xmlHttpRequest對象,所有的請求都是xmlHTTPRequest對象來完成的,

jquery 封裝了JavaScript了,可以更快捷的實現ajax請求

ajax代碼要寫在前端頁面中,

下面以實例講解

在url 文件中,創建index api

from django.conf.urls import url
from django.contrib import admin

from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),  -------index api ,
]

在settings文件中配置靜態文件的路徑

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR,'static')

 

在views文件文件,創建視圖函數index,

from django.shortcuts import render,HttpResponse

# Create your views here.

def index(request):
    import time
    time.sleep(5)#等待5秒,才能看到請求的結果,這是同步



    return HttpResponse('ajax  !!!!')

在template模板中創建index頁面,應用bootstrap 和jquery,

過程:

1.在index頁面輸入內容后,有get和post兩種方法向后端發送數據,在ajax里,有需要的幾個參數,針對不同的情況

    url是必填的,是要誰發送請求,

    type 是發送request的方法,默認是GET方法,可以不寫,但如果是POST方法,就要標明了

    data: 是客戶端發給服務端的數據,是一個json的object對象,實際上在發送的時候進行了,編碼以某種格式(urlencode:?a=1&b=2)發給服務器,urlencode是一種編碼格式,?a=1&b=2 就是urlencode 編碼格式,

data:JSON.stringify({ 
      a:1,  
      b:2,
      )}
JSON.stringify
直接寫data是一個json對象,如果要求data是一個json字符串,就用jSON.stringify 把對象轉成json字符串,
之前沒有加,JSON.stringify 是默認已經做了,轉成了json字符串,
contentType:"application/json"

    contenType:用來指明當前請求數據的編碼格式,contentType:"application/json",一旦設定,data必須是json字符串,不能使json對象,

    processData :聲明當前的數據是否進 行轉碼處理,默認是True,就是轉碼,如果不做編碼處理,當傳圖片,xml,二進制數據的時候就不需要做轉碼處理,設置為False,

    success:是回調函數,處理拿到后端或者服務器返回的數據,用參數接收,接收到的是json數據類型,所以要把接收的數據進行解析,

    error:是當請求或者返回發生錯誤的時候,用,

    complete:是不管正確與否,都要執行的函數

    statusCode: 是返回狀態碼,一個狀態碼對應一個函數,如: 是404 的錯誤,就可以執行一個函數,

2.當發送到url 參數對應的地址ajaxHandle后,就開始執行視圖函數ajaxHandle,視圖函數給出響應和判斷,最終返回到頁面,進行顯示

 

發送的地址是ajaxHandle視圖函數,由它執行處理請求,

{% load staticfiles %}  ----------引用靜態文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script src="{% static 'bootstrap/jquery-3.2.1.js' %}"></script>

</head>
<body>

用戶名:<input type="text">

<button>Ajax提交</button>

</body>

</html>

ajax 的get請求  ,是input框觸發事件,包括發生錯誤的時候,觸發error函數執行

{#    ajax的get請求#}
    $(".user").blur(function () {

        var user=$(this).val();

        ajax語法,在函數內,
        $.ajax({
                        參數url 要發送到哪里
            url:'/ajaxHandle/',
                        ajax 的發送請求,不寫,是默認get請求
            type:'GET',
                    date 是ajax給服務端或者后端發送的數據,要用json的數據格式
            date:{"user":user},
                         回調函數,ajax發送完數據后,,就要處理后端或者服務器接收到的數據,就要用到回調函數,這就是異步,
                          success 里的date參數 就是接收到的json字符串(只有json可以在網絡間傳輸,),所以接收到后需要解析成js對象
           date 數據就是視圖函數傳的返回值, 
       success:function (date) { date=JSON.parse(date); 拿到數據開始判斷,不正確,就給用戶提示下 }, 如果請求數據是錯誤的,或者是沒有請求到,就沒必要處理這些數據,觸發error函數執行         
      error:function(jpxmlHttpresponse,textStatue,err){
          #請求都是xmlHTTPRequest對象來完成的,
          #textstatue ,就是請求完成的狀態,
          #err,底層通過throw拋出的異常對象,值與錯誤類型有關,
      },
      complete是就像python的finally,try是正常執行的代碼,except 是錯誤的時候執行的代碼,finall就是不管正確錯誤都要執行的代碼,       
      complete:function(jpxmlHttpresponse,textstatue){
      
      },

      statusCode 是狀態碼,是哪個狀態碼,就執行哪個函數
      statusCode:{
       "403":function(jpxmlHttpresponse,textstatus,err{
          console.log(argument)
          }
      },
       "404":function(){
        
        }
}) })

ajax的post請求,是button觸發事件,與form表單請求一樣,都會被forbidden掉,

{#  ajax的post請求,會被forbidden .#}

    $("button").click(function () {
        $.ajax({
            url:"/ajaxHandle/",
            type:"POST",
            data:{"user":"egon"},
            success:function () {
                alert(333)
            }
        })
    })

ajax發送的請求要有視圖函數來處理ajaxHandle。

def index(request):
    # import time
    # time.sleep(5)#等待5秒,才能看到請求的結果,這是同步



    return render(request,'index.html')


def ajaxHandle(request):

    #ajaxHandle 是index  發送請求要調用的函數,所以就要判斷是那種方式的請求
    if request.method =="POST":
        obj = HttpResponse("ok")
        obj.status_code=404

        return obj

    print('ajax.....')
    #GET是發送的方法,get()是去字典里的值
    user = request.GET.get("user")#從頁面中request里取出前端傳來的數據

    #user 與數據庫的數據進行判斷,
    # user.objects.filter(username=user)
    ret = {"flag":False}
    if user =="yuan":
        ret["flag"]=True



    return HttpResponse(json.dumps(ret))#HttpResponse必須返回的是一個實例

 

ajax的另一種發送方式:

$.ajax("/ajaxHandle/"){   },url是必填的

ajax的另一種流程:

1.發送請求,

2.server接收請求,

3.server處理數據

4.server端返回響應,

5.ajax接收數據

如果5個步驟都順利進行(返回200 OK)觸發success函數執行,

 

 

 

 

 

 

 

 

 

 

 

 

 

def index(request):
# import time
# time.sleep(5)#等待5秒,才能看到請求的結果,這是同步



return render(request,'index.html')


def ajaxHandle(request):

#ajaxHandle index 發送請求要調用的函數,所以就要判斷是那種方式的請求
if request.method =="POST":
obj = HttpResponse("ok")
obj.status_code=404

return obj

print('ajax.....')
#GET是發送的方法,get()是去字典里的值
user = request.GET.get("user")#從頁面中request里取出前端傳來的數據

#user 與數據庫的數據進行判斷,
# user.objects.filter(username=user)
ret = {"flag":False}
if user =="yuan":
ret["flag"]=True



return HttpResponse(json.dumps(ret))#HttpResponse必須返回的是一個實例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM