Django与Ajax

Ajax是什么

Ajax是一种用于创建交互式Web应用程序的技术。它是Asynchronous JavaScript and XML的缩写,意思是使用JavaScript和XML进行异步数据交换。通过Ajax技术,可以在不刷新整个页面的情况下更新页面的某个部分或者获取服务器数据,并能够动态地将这些数据加入到页面中。Ajax被广泛应用于许多网站和Web应用程序中,已经成为Web开发的重要一环。

AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和XML"。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。

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

AJAX除了异步 的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程想)
优点

  • AJAX使用Javascript技术向服务器发送异步请求
  • AJAX无须刷新整个页面

基于jquery的Ajax实现

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

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

           $.ajax({
               url:"/handle_Ajax/",
               type:"POST",
               data:{username:"Yuan",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>

Ajax---->服务器------>Ajax执行流程图

Ajax案例

通过Ajax,实现前端输入两个数字,服务器做加法,返回到前端页面
views模块

from django.shortcuts import render,HttpResponse
from django.http import JsonResponse
import json

# Create your views here.

def ab_ajax(request):
    # if request.is_ajax():
    if request.method == "POST":
        print(request.POST)
        d1 = request.POST.get('inp1')  # str
        d2 = request.POST.get('inp2')  # str
        d3=int(d1)+int(d2)
        print(d3)
       

        json.dumps(d3)
        return HttpResponse(json.dumps(d3))#序列化

        #想返回一个字典
        #user_dict={"username":"kevin","password":123}#第二部分
        #return HttpResponse(json.dumps(user_dict))#第二部分
        #return JsonResponse(user_dict)# 后端用JsonResponse不用反序列化#第二部分

    return render(request, 'ab_ajax.html')

templates\ab_ajax.html模块

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
{#ajax的三种序列化情况#}
<input type="text" id="inp1">
<input type="text" id="inp2">
<input type="text" id="inp3">

<button class="btn">提交</button>

<script>
    $(".btn").click(function(){

        var inp1=$("#inp1").val();
        var inp2=$("#inp2").val();

        $.ajax({
            url:'',
            type:'post',
            dataType:'json',
            {#加这个就不用反序列化了,因为返回类型已经是json格式了#}
            data:{inp1:inp1,inp2:inp2},

            success:function(res){
                console.log(res)

                {#变成对象#}

                {#res=JSON.parse(res)#}


{#后端返回的数据要反序列化,#}
                console.log(typeof res)
                console.log(res.username)
                console.log(res.password) // 就是拿后端返回的数据
                {#$("#inp3").val(res);#}
                {#第三个框#}
            }

        })


        }
    )

</script>
</body>
</html>

Ajax提交json格式的数据

浏览器请求头为:

Content-Type:

multipart/form-data; boundary=----WebKitFormBoundaryA5O53SvUXJaF11O2

views模块

from django.shortcuts import render

# Create your views here.
import json
def index(request):

# # request.POST只能接收post请求的符合urlencoded编码格式的数据 {}

    if request.method =='POST':
       print(request.POST)#  <QueryDict: {}>
       print(request.body)#  b'{"a":1,"b":2}'
       json_bytes=request.body#二进制格式,接收浏览器发过来的纯原生数据,需要自己转换格式

        #第一种方法
       json_str=json_bytes.decode('utf-8') #decode 转码
       print(json_str)#{"a":1,"b":2}json格式

       json_dict=json.loads(json_str)
       print(json_dict)#{'a': 1, 'b': 2}字典形式

        #第二种方法(有bug)
       json_dict=json.loads(json_bytes)
       print((json_dict,type(json_dict)))


    return render(request,'index.html')

templates\index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<button class="btn">提交</button>
<script>
    $(".btn").click(function(){
        $.ajax({
            url:'',
            type:'post',
            data:JSON.stringify({a:1,b:2}),//序列化
            contentType:'application/json',//json格式的
            success:function(res){

            }
        })
    })

</script>


</body>
</html>

Ajax提交文件数据

templates\index.html

<script>
    $(".btn").click(function (ev) {
        console.log(123);
        // 要获取到文件数据,
        {#console.log($("#myfile")[0].files[0]) // C:\fakepath\123.png#}
        // 提交文件数据需要借助于formdata对象
        var myFormDataObj = new FormData;
        var username = $("#username").val();
        var myfile = $("#myfile")[0].files[0];
        myFormDataObj.append('username', username);
        myFormDataObj.append('myfile',myfile);

        $.ajax({
            url: '',
            type: 'post',
            {#data: JSON.stringify({a: 1, b: 2}), // 序列化的     "{"a":1, "b":2}"#}
            data: myFormDataObj, // 序列化的     "{"a":1, "b":2}"
            {#contentType: 'application/json', // json格式的#}
            contentType:false, // 告诉浏览器不要给我的编码格式做任何的处理
            processData: false, //
            success: function (res) {

            }
        })
    })
</script>

views

from django.shortcuts import render

# Create your views here.
import json
def index(request):

    if request.method =='POST':
       print(request.POST)#  <QueryDict: {}>
      
     
       print(request.FILES)
       myfile=request.FILES.get('myfile')




    return render(request,'index.html')
相关推荐
2401_890666137 分钟前
(免费送源码)计算机毕业设计原创定制:Java+JSP+HTML+JQUERY+AJAX+MySQL springboot计算机类专业考研学习网站管理系统
java·python·django·flask·node.js·html·课程设计
XWM_Web38 分钟前
JavaApi---第二节
java·开发语言·python·学习
Zaly.1 小时前
【Python刷题】动态规划相关问题
开发语言·python·动态规划
只怕自己不够好1 小时前
《全面解析图像平滑处理:多种滤波方法及应用实例》
图像处理·python·opencv
股票GPT分析1 小时前
《Python 股票交易分析:开启智能投资新时代》(一)
服务器·开发语言·python·fastapi
天才奇男子1 小时前
Python爬虫爬取网页小说
开发语言·爬虫·python
努力更新中1 小时前
Python浪漫之画明亮的月亮
开发语言·python·动画
数据小爬虫@1 小时前
利用Python爬虫获取商品评论:技术与实践
开发语言·爬虫·python
叫我:松哥2 小时前
基于python flask的网页五子棋实现,包括多种语言,可以悔棋、重新开始
开发语言·python·算法·游戏·flask
秋夜白2 小时前
【排序算法 python实现】
开发语言·python·排序算法