ajax

1、前端有哪些方式可以向后端发请求

浏览器窗口手动输入网址       get请求
a标签的href属性            get请求
form表单                  get/post请求(默认是get请求)
ajax                     get/post请求

2、ajax的特点

异步提交
局部刷新

3、ajax基本语法

// 提交的地址(url)
// 提交的方式(type)
// 提交的数据(data)
// 回调函数(success)


// 例1:前端往后端发送数据,后端处理后再返回

// urls.py
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),

]

// views.py
from django.shortcuts import render, HttpResponse

# Create your views here.
def index(request):
    if request.method == 'POST':
        print(request.POST)
        name = request.POST.get("name")
        password = request.POST.get("password")
        return HttpResponse("name:" + name + " " + "password:" + password)
    return render(request, 'index.html')

// index.html
<body>
<button id="d1">选我</button>

<script>
    $('#d1').click(function () {
        $.ajax({
            // 提交的地址
            url:'/index/',
            // 提交的方式
            type:'post',
            // 提交的数据
            data:{'name':'jason','password':'123'},
            // 回调函数
            // data接收的就是异步提交返回的结果
            success:function (data) {
                alert(data)
            }
        })
    })
</script>
</body>

点击按钮后,结果:

ajax

例2:前端有三个输入框,前两个框中的值相加,显示在第三个框中

views.py

def index(request):
    if request.method == 'POST':
        i1 = request.POST.get("i1")
        i2 = request.POST.get("i2")
        res = int(i1) + int(i2)
        return HttpResponse(res)
    return render(request, 'index.html')

index.html

<body>
<input type="text" id="i1">+<input type="text" id="i2">=<input type="text" id="i3">
<button id="d1">相加</button>

<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',  //url参数可以不写,默认就是当前页面打开的地址
            type:'post',
            data:{'i1':$('#i1').val(),'i2':$('#i2').val()},
            success:function (data) {
                $('#i3').val(data)
            }
        })
    })
</script>

</body>

结果:

ajax

4、ajax传输json格式的数据

前后端传输数据,数据是什么格式就应该说明是什么格式(数据与编码要一一对应)

views.py

import json
def index(request):
    if request.method == 'POST':
        # json格式的数据存储在了request.body中
        print(request.body)
        data = request.body
        res1 = data.decode('utf-8')
        # 转成字典
        res2 = json.loads(res1)
        print(res2, type(res2))
        return HttpResponse('OK')
    return render(request, 'index.html')

index.html

<body>
<button id="d1">点击</button>

<script>
    $('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            contentType:'application/json',   // 说明数据格式
            data:JSON.stringify({'name':'jason','hobby':'study'}),
            success:function (data) {
                {#$('#i3').val(data)#}
                alert(data)
            }
        })
    })
</script>
</body>

结果:

ajax

pycharm中:

ajax

5、ajax传输文件数据

index.html

<body>
<input type="file" name="myfile" id="i1">
<button id="d1">点击传输</button>

<script>
    $('#d1').click(function () {
        // ajax传输文件需要借助于内置对象FormData
        let formdata = new FormData();
        formdata.append('name', 'jason');
        // 获取input框存放的文件
        formdata.append('myfile', $('#i1')[0].files[0]);
        $.ajax({
            url:'',
            type:'post',
            data:formdata,

            // ajax发送文件需要修改两个固定的参数
            // 1.告诉浏览器不要处理我的数据
            processData:false,
            // 2.不要用任何编码,就用我formdata自带的编码格式,Django能够自动识别该formdata对象
            contentType:false,
            // 回调函数
            success:function (data) {
                alert(data)
            }
        })

    });
</script>

</body>

views.py

def index(request):
    if request.method == 'POST':
        print(request.POST)
        print(request.FILES)
        return HttpResponse('文件收到了')
    return render(request, 'index.html')

结果:

ajax

ajax

6、form表单与ajax异同点

1.form表单不支持异步提交局部刷新
2.form表单不支持传输json格式数据
3.form表单与ajax默认传输数据的编码格式都是urlencoded

7、MTV和MVC

MTV与MVC
    MTV模型(django):
        M:模型层(models.py)
        T:templates
        V:views

    MVC模型:
        M:模型层(models.py)
        V:视图层(views.py)
        C:控制器(Controller) urls.py

    本质:django的MTV也是MVC