Django Ajax

1. AJAX简介

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

2. AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

3. AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户
的感受是在不知不觉中完成请求和响应过程)

4. AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
ajax提交数据页面不用刷新,原始数据还在,处理数据的过程中不影响页面其他操作
form表单提交数据页面刷新,原始数据不在,并且处理数据的过程中无法做其他操作
Ajax还可以和form组件一起使用

2. AJAX常见应用情景

在这里插入图片描述

例如注册时候的用户名的查重。

这里就使用了AJAX技术,当文件框发生了输入变化时,使用AJAX技术向服务器发送一个请求,然后服务器会把查询到的结果
响应给浏览器,最后再把后端返回的结果展示出来。整个过程中页面没有刷新,只是刷新页面中的局部位置而已,且当请求发
出后,浏览器还可以进行其他操作,无需等待服务器的响应

3. AJAX 简易使用

		
		{#csrf#}
		$.ajaxSetup({
		            data: {csrfmiddlewaretoken: '{{ csrf_token }}'}
		        })
        $('#btn').click(function () {
            let book_title = $('#book_title').val();
            let book_price = $('#book_price').val();
            let authors_name = $('#authors_name').val();
            let publish_name = $('#publish_name').val();
            let publish_time = $('#publish_time').val();
            //$.ajax为固定用法,表示启用ajax
            $.ajax({
            	//url后面跟的是ajax提交数据的路径,不写就是向当前路径提交
                url: '', 
                //type用于指定ajax请求的方法
                type: 'post', 
                ContentType: 'application/x-www-form-urlencoded',
                //data后面的数据就是提交给后端的数据
                data: {
                    'book_title': book_title,
                    'book_price': book_price,
                    'authors_name': authors_name,
                    'publish_name': publish_name,
                    'publish_time': publish_time,
                },  // 请求携带的数据
                //success为回调函数,参数args为后端给你返回的数据
                success: function (args) {  // 异步回调函数 后端有回复自动触发
                    {#window.location.assign("{% url 'book' %}")#}
                    alert(123)
                }
            })
        })

后端判断Ajax请求

request.is_ajax() 方法可以用于判断是否为Ajax请求

4. 前后端传输数据编码格式

"""
请求体中携带编码格式
	Content-Type:...
django针对不同编码方式对应的数据格式会采用不同的处理策略
"""
form表单默认发送的编码格式
		Content-Type: application/x-www-form-urlencoded
		数据格式:username=xxx&password=123
		django后端会自动处理到:request.POST
form表单发送文件
		Content-Type: multipart/form-data
		数据格式:隐藏不让看
		django后端会自动处理:request.POST  request.FILES
ajax默认的编码格式
		Content-Type: application/x-www-form-urlencoded
		数据格式:username=xxx&password=123
		django后端会自动处理到:request.POST

5. Ajax发送json格式数据

# form表单是无法发送json格式数据的!!!
ajax发送的数据类型一定要跟数据的编码格式一致 
    编码格式是urlencoded 
    数据格式就应该是username=xxx&password=123
    不能发送json格式数据
"""
django后端针对json格式的数据不会做任何的处理 就在request.body内
需要我们自行处理
"""
$('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',  // 不写默认也是get请求
            contentType:'application/json',  // 不写默认是urlencoded编码
            data:JSON.stringify({'name':'xxx','pwd':123}),  // 序列化方法
            success:function (args) {
            }
        })
    })

6. Django自带的序列化组件

from app01 import models
from django.http import JsonResponse
from django.core import serializers
def d_data(request):
    # 前后端分离之后 django orm产生的queryset无法直接被前端识别 还是需要json格式数据(硬通货)
    # data_list = []  # [{}, {}, {}]
    # user_queryset = models.User.objects.all()
    # for user_obj in user_queryset:
    #     data_list.append({
    #         'pk':user_obj.pk,
    #         'name':user_obj.name,
    #         'age':user_obj.age,
    #         'gender':user_obj.gender,
    #         'gender_real':user_obj.get_gender_display(),
    #         'addr':user_obj.addr
    #     })
    # return JsonResponse(data_list,safe=False)
    user_queryset = models.User.objects.all()
    ret = serializers.serialize('json', user_queryset)
    return HttpResponse(ret)

7. Ajax携带文件数据

$("#d1").click(function () {
        // 需要利用内置js内置对象FormData
        let myFormData = new FormData();
        // 对象添加普通数据
        myFormData.append('username',$('#name').val())
        myFormData.append('password',$('#pwd').val())
        // 对象添加文件数据
        myFormData.append('my_file',$('#file')[0].files[0])
        // 发送ajax请求
        $.ajax({
            url:'',
            type:'post',
            data:myFormData,
            // 携带文件必须要指定的两个参数
            contentType:false,
            processData:false,
            success:function (args) {
                // 处理异步回调返回的结果
            }
        })
    })

8. Ajax 删除局部刷新

在删除数据库数据时,可以在前端将其数据记录删除即可。

$('#'+del_id).remove()		# 将指定id的记录在前端删除

9. AJAX请求如何设置 csrf_token

不只是ajax,只要是向Django提交post请求的数据,都必须校验csrf_token来防伪跨站请求,那么在ajax中如何让使用csrf_token呢,毕竟又不像form表单那样可以在表单内部使用一句模版语法 {% csrf_token %} 即可

方式一

通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送


	$.ajax({
	  url: "/cookie_ajax/",
	  type: "POST",
	  data: {
	    "username": "Tonny",
	    "password": 123456,
	    // 使用JQuery取出csrfmiddlewaretoken的值,拼接到data中
	    "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val()  
	  },
	  success: function (data) {
	    console.log(data);
	  }
	})

方式二

通过获取返回的cookie中的字符串 放置在请求头中发送。
注意:需要引入一个jquery.cookie.js插件


	$.ajax({
	  url: "/cookie_ajax/",
	  type: "POST",
	  // 从Cookie取csrf_token,并设置ajax请求头
	  headers: {"X-CSRFToken": $.cookie('csrftoken')},  
	  data: {"username": "Q1mi", "password": 123456},
	  success: function (data) {
	    console.log(data);
	  }
	})

方式三

自己编写 getCookie 方法:


	function getCookie(name) {
	    var cookieValue = null;
	    if (document.cookie && document.cookie !== '') {
	        var cookies = document.cookie.split(';');
	        for (var i = 0; i < cookies.length; i++) {
	            var cookie = jQuery.trim(cookies[i]);
	            // Does this cookie string begin with the name we want?
	            if (cookie.substring(0, name.length + 1) === (name + '=')) {
	                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
	                break;
	            }
	        }
	    }
	    return cookieValue;
	}
	var csrftoken = getCookie('csrftoken');

方式四

添加以下内容


	$.ajaxSetup({
			     data: {csrfmiddlewaretoken: '{{ csrf_token }}'}
			})
			
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值