ajax:

  1. 什么是ajax,有什么作用:

    以前我们在页面向后台提交数据的时候都是使用from表单,这样的提交会在提交的时候将整个页面全部刷新,如果你在填写表单的时候提交之后发现某个数据不对,但是你已提交的就会将这个页面刷新,想要改就只能重新来过,这样用户的体验感是不好的;所以就有了ajax,它就能帮助开发人员解决这个问题;

     AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
    # 特点:异步请求和局部刷新
    1. 局部刷新: 即不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
    2. AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
          a.同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
          b.异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
  2. ajax的应用:

    {% load static %}      # 导入文件路径,固定写法不能更改
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
    </head>
    <body> <div class="container" style="width: 500px;">
    <div class="form-group">
    <label class="col-sm-2 control-label">账号</label>
    <div class="col-sm-10">
    <input type="text" class="form-control" placeholder="账号" name="account" id="name">
    </div>
    </div>
    <div class="form-group">
    <label class="col-sm-2 control-label">密码</label>
    <div class="col-sm-10">
    <input type="password" class="form-control" placeholder="密码" name="password" id="pwd">
    </div>
    </div>
    <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
    <button type="submit" class="btn btn-default" id="but">提交</button>
    <span id="error"></span>
    </div>
    </div>
    </div>
    </body>
    <script src="{% static 'jquery.js' %}"></script>
    # 导入本地的文件时直接写一个static后边加加上文件名就行
    <script>
    # 触发器,当你鼠标点击提交按钮时触发,执行下边的代码
    $('#but').click(function () {
    # 获取输入框需要提交到后台的数据
    var account = $('#name').val();
    var password = $('#pwd').val();
    # 下边就是ajax的写法,
    # 通过ajax将拿到的数据发送给后端
    $.ajax({
    # 下边是发送请求的路径,
    url:'{% url 'login' %}', # login是urls.py文件中相关路径别名
    # 发送请求的类型,post请求
    type:'post',
    # 下边是你需要提交到后端的数据,写成一个字典形式
    data:{account:account,password:password},
    # 下边是一个响应函数 ret是从后端返回的数据
    success:function (ret) {
    if (ret === '1'){ # 对后端返回的值进行比较是不是相同
    # 判断成功后使用location方法将当前页面跳转到指定的页面/home/
    location.href='/home/'
    }
    else{
    $('#error').text('用户名或者密码错误!')
    }
    }
    })
    })
    </script>
    </html>
  3. 后端如何接收数据并做处理:

    def login(request):
    if request.method == 'GET':
    return render(request,'login.html')
    # 从ajax返回的数据是一个字典的形式,所以直接可以get去相应的值
    name = request.POST.get('name')
    pwd = request.POST.get('password')
    # 对相应的数据进行比较
    if name == 'adrian' and pwd == '123':
    # 成功之后返回一个值
    return HttpResponse('1')
    # 失败之后返回一个值
    return HttpResponse('0')
  4. csrftoken

    详述CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。攻击者通过HTTP请求江数据传送到服务器,从而盗取回话的cookie。盗取回话cookie之后,攻击者不仅可以获取用户的信息,还可以修改该cookie关联的账户信息。

      

      所以解决csrf攻击的最直接的办法就是生成一个随机的csrftoken值,保存在用户的页面上,每次请求都带着这个值过来完成校验。

  5. ajax过csrf认证

    方式1:# 这个方式是将{% csrf_token %}写在前端的页面中,
    $.ajax({
    url: "/cookie_ajax/",
    type: "POST",
    data: {
    "username": "chao",
    "password": 123456,
    "csrfmiddlewaretoken": $("[name = 'csrfmiddlewaretoken']").val()
    # 使用jQuery从页面中取出csrfmiddlewaretoken的值,拼接到data中
    },
    success: function (data) {
    console.log(data);
    }
    }) 方式2:# 写在ajax中在服务器向浏览器发送页面的时候进行模板渲染的时候就进行替换了
    $.ajax({
    data: {csrfmiddlewaretoken: '{{ csrf_token }}' },
    });
    方式3
    #这个方式是使用jquery来操作cookie值:
    首先需要导入一个文件包:这个包是专门用来操作cookie的 下载网址 https://plugins.jquery.com/cookie/
    <script type="text/javascript" src="js/jquery.cookie.js"></script>
    $.ajax({ headers:{"X-CSRFToken":$.cookie('csrftoken')},
    #其实在ajax里面还有一个参数是headers,自定制请求头,可以将csrf_token加在这里,我们发contenttype类型数据的时候,csrf_token就可以这样加 }) jquery操作cookie: https://www.cnblogs.com/clschao/articles/10480029.html

form表单文件上传:

  1. 需要注意的是: enctype

    <form action="" method="post" enctype="multipart/form-data">
    # 注意如果用form表单上传文件时,需要设置上传的格式 enctype="multipart/form-data" 这种form_data的格式一般是把大数据一段一段隔开的
    {% csrf_token %}
    用户名: <input type="text" name="username">
    密码: <input type="password" name="password">
    头像: <input type="file" name="file"> # 获取文件
    <input type="submit">
    </form> views.py
    def upload(request):
    if request.method == 'GET':
    print(settings.BASE_DIR) #/static/
    return render(request,'upload.html')
    else:
    print(request.POST)
    print(request.FILES)
    uname = request.POST.get('username')
    pwd = request.POST.get('password')
    file_obj = request.FILES.get('file') #文件对象
    print(file_obj.name) # 获取文件名称
    with open(file_obj.name,'wb') as f:
    # for i in file_obj:
    # f.write(i)
    for chunk in file_obj.chunks():
    f.write(chunk)
    return HttpResponse('ok')

ajax文件上传:

  1. 参数:

    1. processData:声明当前的data数据是否进行转码或预处理,默认为true,即预处理;if为false,
    那么对data:{a:1,b:2}会调用json对象的toString()方法,即{a:1,b:2}.toString()
    ,最后得到一个[object,Object]形式的结果。 2. contentType:默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。
    用来指明当前请求的数据编码格式;urlencoded:?a=1&b=2;如果想以其他方式提交数据,
    比如contentType:"application/json",即向服务器发送一个json字符串:
    $.ajax("/ajax_get",{
    data:JSON.stringify({
    a:22,
    b:33
    }),
    contentType:"application/json",
    type:"POST",
    }); //{a: 22, b: 33}
    注意:contentType:"application/json"一旦设定,data必须是json字符串,不能是json对象
    views.py: json.loads(request.body.decode("utf8")) 3. traditional:一般是我们的data数据有数组时会用到 :data:{a:22,b:33,c:["x","y"]},
    traditional为false会对数据进行深层次迭代;
  2. 操作:

    $('#but').click(function () {
    
            var formdata = new FormData();
    {#由于ajax不能像form表单那样设置上传文件的格式,所以就需要借助FormData#}
    {# 首先创建一个formdata对象#}
    var files = $('[type=file]')[0].files[0];
    {#首先需要获取到文件信息,需要使用DOM的方法files来获取#}
    formdata.append('file',files);
    {#将需要的文件添加到这个对象中#} $.ajax({
    url:'{% url 'input' %}',
    type:'post',
    data:formdata,
    {#上传数据时直接写这个对象就行#}
    processData:false, {#不处理数据#}
    contentType:false, {#不设置内容类型#}
    headers:{"X-CSRFToken":$.cookie('csrftoken')},
    success:function (ret) {
    {#逻辑代码#}
    }
    })
    })

django ajax应用的更多相关文章

  1. Django ajax MYSQL Highcharts<1>

    Another small project with django/Ajax/Mysql/Highcharts. 看下效果图  - delivery dashboard .嘿嘿 是不是还蛮好看的. 废 ...

  2. django ajax练习

    这几天遇到了django ajax请求出错的问题,总结一下 前端js:我这里创建的是一个字典格式的数据,前端js收到字典之后也是要用字典的形式去解包后台传送过来的数据,比如我下面的写法:data['s ...

  3. 关于Django Ajax CSRF 认证

    CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的 ...

  4. django ajax增 删 改 查

    具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...

  5. python学习-- Django Ajax CSRF 认证

    使用 jQuery 的 ajax 或者 post 之前 加入这个 js 代码:http://www.ziqiangxuetang.com/media/django/csrf.js /*======== ...

  6. django ajax 及批量插入数据 分页器

    ``` Ajax 前端朝后端发送请求都有哪些方式 a标签href GET请求 浏览器输入url GET请求 form表单 GET/POST请求 Ajax GET/POST请求 前端朝后端发送数据的编码 ...

  7. Django——Ajax

    1.Ajax简介 AJAX(Asynchronous Javascript And XML)--"异步的JavaScript与XML". Ajax使用Javascript语言与服务 ...

  8. django ajax提交form表单数据

    后台: from django.shortcuts import render from django.shortcuts import redirect from django.shortcuts ...

  9. Django ajax提交 登录

    一.url from django.contrib import adminfrom django.urls import pathfrom appo1 import views urlpattern ...

  10. django ajax报错解决:You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set.

    Django版本号:1.11.15 django中ajax请求报错:You called this URL via POST, but the URL doesn't end in a slash a ...

随机推荐

  1. 如何优雅地使用云原生 Prometheus 监控集群

    作者陈凯烨,腾讯云前端开发工程师.负责 TKE 集群,弹性集群和云原生监控等模块控制台开发. 概述 Prometheus 是一套开源的系统监控报警框架.2016 年,Prometheus 正式加入 C ...

  2. html怎么在网页标题栏上添加图标

    需要先把图片格式转换为.ico类型在这个网址在线转换很方便:https://www.easyicon.net/covert/在<head></head>加一行来显示图标(注意, ...

  3. nodejs+express+mongodb 快速接口开发

    nodejs+mongodb+express API快速生成 使用说明 安装 $ npm install duzq-quick-mongo 建立mongodb数据模型 const mongoose = ...

  4. android 使用 Lottie

    1.添加依赖 dependencies { implementation 'com.airbnb.android:lottie:2.5.5'//lottie } 2.1layout实现 <?xm ...

  5. mysql-font1251错误

    控制台中先连接mysql: ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; ALTER US ...

  6. yum被系统升级锁定

    Another app is currently holding the yum lock; waiting for it to exit... 可能是系统自动升级正在运行,yum在锁定状态中. 已经 ...

  7. 多线程那点事—Parallel.for

    先看段代码: 1 for (int i = 0; i < 10; i++) 2 { 3 Task.Factory.StartNew(()=>Console.WriteLine($" ...

  8. ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成

    在一般的系统中,往往也有短信模块的需求,如动态密码的登录,系统密码的找回,以及为了获取用户手机号码的短信确认等等,在ABP框架中,本身提供了对邮件.短信的基础支持,那么只需要根据自己的情况实现对应的接 ...

  9. SQL Server解惑——为什么ORDER BY改变了变量的字符串拼接结果

      在SQL Server中可能有这样的拼接字符串需求,需要将查询出来的一列拼接成字符串,如下案例所示,我们需要将AddressID <=10的AddressLine1拼接起来,分隔符为|.如下 ...

  10. Spark学习进度-Transformation算子

    Transformation算子 intersection 交集 /* 交集 */ @Test def intersection(): Unit ={ val rdd1=sc.parallelize( ...