1. 程式人生 > >django系列6--Ajax01 特點, 基本格式, 向前端發送數據

django系列6--Ajax01 特點, 基本格式, 向前端發送數據

ade django type int doc lock 異步請求 技術分享 pri

一.Ajax了解

AJAX(Asynchronous Javascript And XML)優點是在不重新加載整個頁面的情況下,可以與服務器交換數據並更新部分網頁內容

優點:

1.ajax使用JavaScript技術向服務器發送異步請求

2.ajax請求無需刷新整個頁面

3.服務器響應內容不再是整個頁面,而是頁面中的部分內容,所以ajax性能高


二.Ajax使用

基本格式

//基於按鈕點擊事件實現的
<script src="{% static 'js/jquery.js' %}"></script>
<script>
    $('#sub').click(function () {
    
        //$.ajax({鍵值對參數})
        $.ajax({
            url:"{% url 'login' %}",
            type:'post',
            data:{'username':uname,'pwd':pwd,'csrfmiddlewaretoken':csrf_token},
            success:function (response) {  // response這個參數名字是自定義的

            }
        })
    })

</script>

1.jQuery的實現

<button class="send_Ajax">send_Ajax</button>
<script>

       $(".send_Ajax").click(function(){

           $.ajax({
               url:"/handle_Ajax/",
               type:"POST",
               data:{username:"tom",password:123},
               success:function(data){
                   console.log(data)
               },
               
               error: function (jqXHR, textStatus, err) {
                        console.log(arguments);
                    },

               complete: function (jqXHR, textStatus) {
                        console.log(textStatus);
                },

               statusCode: {
                    '403': function (jqXHR, textStatus, err) {
                          console.log(arguments);
                     },

                    '400': function (jqXHR, textStatus, err) {
                        console.log(arguments);
                    }
                }

           })

       })

</script>


2.原生Js實現

var bt2 = document.getElementById("bt2");
  bt2.onclick = function () {
    // 原生JS
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open("POST", "/ajax_test/", true);
    xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlHttp.send("username=tom&password=123");
    xmlHttp.onreadystatechange = function () {
      if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
        alert(xmlHttp.responseText);
      }
    };
  };


三.使用ajax傳送數據

用一個簡單的登錄驗證實例來說明,用戶名和密碼正確提示成功.否則顯示失敗

發送的數據如果是字典時,其中的引號必須是雙引號,否則傳到前端使用會報錯,

如{ “data”: data } , 不要用{‘data’: data}

1.使用 JsonResponse 來發送數據(最好)

這樣發送的數據,前端就不用解析了,可以直接當作對象來使用

views.py

from django.shortcuts import render,redirect,HttpResponse
from django.http import JsonResponse
from app01 import models

# Create your views here.
def login(request):
    if request.method == 'POST':
        username = request.POST.get("username")
        password = request.POST.get("password")
        print(username, password)
        ret = models.Userinfo.objects.filter(username=username,password=password)
        print(ret)
        a = {"status":None}
        if ret:
            a["status"] = True
            print(a)
            return JsonResponse(a)
        else:
            return HttpResponse("fail")
    else:
        return render(request,"login.html")

login.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% csrf_token %}
用戶名: <input type="text" id="username">
密碼: <input type="password" id="password">
<button id="sub">登陸</button>
<span id="mag" style="color: red;font-size: 12px;"></span>


<script src="{% static 'js/jquery.min.js' %}"></script>
<script>
    $("#sub").click(function () {
        var uname = $("#username").val();
        var pwd = $("#password").val();
        var csrf_token = $("input[name=csrfmiddlewaretoken]").val();
        $.ajax({
            url:"{% url 'login' %}",
            type:"post",
            data:{"username":uname,"password":pwd,"csrfmiddlewaretoken":csrf_token},
            success:function (response) {
                console.log(response, typeof response);
                if (response.status){
                    $("span").text("登陸成功");
                }else{
                    $("span").text("失敗");
                }
            }
            }
        )
    })

</script>

</body>
</html>


2.使用HttpResponse來向前端發送消息

HttpResponse加一個頭就可以了,這樣使用HttpResponse(data, content_type=content_type=‘application/json‘)

這樣在前端html頁面就不用解析json格式了,可以直接作為對象調用數據


views.py

from django.shortcuts import render,redirect,HttpResponse
from django.http import JsonResponse
from app01 import models
import json


# Create your views here.
def login(request):
    if request.method == 'POST':
        username = request.POST.get("username")
        password = request.POST.get("password")
        print(username, password)
        ret = models.Userinfo.objects.filter(username=username,password=password)
        print(ret)
        a = {"status":None}
        if ret:
            a["status"] = True
            print(a)
            msg = json.dumps(a)
            return HttpResponse(msg, content_type='application/json')
        else:
            msg = json.dumps(a)
            return HttpResponse(msg, content_type='application/json')
    else:
        return render(request,"login.html")

login.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% csrf_token %}

用戶名: <input type="text" id="username">
密碼: <input type="password" id="password">
<button id="sub">登陸</button>
<span id="mag" style="color: red;font-size: 12px;"></span>

<script src="{% static 'js/jquery.min.js' %}"></script>  # 通過別名引入靜態文件
<script>
    $("#sub").click(function () {
        var uname = $("#username").val();
        var pwd = $("#password").val();
        var csrf_token = $("input[name=csrfmiddlewaretoken]").val();
        $.ajax({
            url:"{% url 'login' %}",
            type:"post",
            data:{"username":uname,"password":pwd,"csrfmiddlewaretoken":csrf_token},
            success:function (response) {
                console.log(response, typeof response);
                
                if (response.status){
                    $("span").text("登陸成功");
                }else{
                    $("span").text("失敗");
                }
            }
            }
        )
    })

</script>

</body>
</html>


3.引入json模塊,發送json格式的消息

向前端發送的是json格式的消息,所以在前端要用JSON.parse()來反序列化字符串為JSON對象之後才能使用

views.py

from django.shortcuts import render,redirect,HttpResponse
from app01 import models
import json


# Create your views here.
def login(request):
    if request.method == 'POST':
        username = request.POST.get("username")
        password = request.POST.get("password")
        print(username, password)
        ret = models.Userinfo.objects.filter(username=username,password=password)
        print(ret)
        a = {"status":None}
        if ret:
            a["status"] = True
            print(a)  # {'status': True}
            msg = json.dumps(a)
            return HttpResponse(msg)
        else:
            return HttpResponse(a)
    else:
        return render(request,"login.html")

login.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% csrf_token %}
用戶名: <input type="text" id="username">
密碼: <input type="password" id="password">
<button id="sub">登陸</button>
<span id="mag" style="color: red;font-size: 12px;"></span>

<script src="{% static 'js/jquery.min.js' %}"></script>
<script>
    $("#sub").click(function () {
        var uname = $("#username").val();
        var pwd = $("#password").val();
        var csrf_token = $("input[name=csrfmiddlewaretoken]").val();
        
        $.ajax({
            url:"{% url 'login' %}",
            type:"post",
            data:{"username":uname,"password":pwd,"csrfmiddlewaretoken":csrf_token},
            success:function (response) {
                console.log(response, typeof response);
                msg = JSON.parse(response);  
                if (msg.status){
                    $("span").text("登陸成功");
                }else{
                    $("span").text("失敗");
                }
            }
            }
        )
    })
</script>

</body>
</html>

實現結果:
技術分享圖片

django系列6--Ajax01 特點, 基本格式, 向前端發送數據