• Django之初识Ajax


     

    1.简介

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

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

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

        AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

          a.同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;

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

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

     2.示例

        页面输入两个整数,通过AJAX传输到后端计算出结果并返回。

        html文件名称为ajax_demo1.html,内容如下

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="x-ua-compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <title>AJAX局部刷新实例</title>
    </head>
    <body>
    
    <input type="text" id="i1">+
    <input type="text" id="i2">=
    <input type="text" id="i3">
    <input type="button" value="AJAX提交" id="b1">
    
    <script src="/static/jquery-3.2.1.min.js"></script>
    <script>
      $("#b1").on("click", function () {
        $.ajax({
          url:"/ajax_add/", //别忘了加双引号
          type:"GET",  
          data:{"i1":$("#i1").val(),"i2":$("#i2").val()}, //object类型,键值形式的,可以不给键加引号
          success:function (data) {
            $("#i3").val(data);
          }
        })
      })
    </script>
    </body>
    </html>
    复制代码

        views.py里面的内容:

    复制代码
    def ajax_demo1(request):
        return render(request, "ajax_demo1.html")
    
    
    def ajax_add(request):
    #time.sleep(10) #不影响页面发送其他的请求 i1 = int(request.GET.get("i1")) i2 = int(request.GET.get("i2")) ret = i1 + i2 return JsonResponse(ret, safe=False)
    #return render(request,'index.html') #返回一个页面没有意义,就是一堆的字符串,拿到了这个页面,你怎么处理,你要做什么事情,根本就没有意义
    复制代码

        urls.py里面的内容

    urlpatterns = [
        ...
        url(r'^ajax_add/', views.ajax_add),
        url(r'^ajax_demo1/', views.ajax_demo1),
        ...   
    ]

       启动django项目,然后运行看看效果,页面不刷新

      3.AJAX常见应用情景

        搜索引擎根据用户输入的关键字,自动提示检索关键字。

        还有一个很重要的应用场景就是注册时候的用户名的查重。

        其实这里就使用了AJAX技术!当文件框发生了输入变化时,使用AJAX技术向服务器发送一个请求,然后服务器会把查询到的结果响应给浏览器,最后再把后端返回的结果展示出来

          a.整个过程中页面没有刷新,只是刷新页面中的局部位置而已!

          b.当请求发出后,浏览器还可以进行其他操作,无需等待服务器的响应!

               

        当输入用户名后,把光标移动到其他表单项上时,浏览器会使用AJAX技术向服务器发出请求,服务器会查询名为lemontree7777777的用户是否存在,最终服务器返回true表示名为lemontree7777777的用户已经存在了,浏览器在得到结果后显示用户名已被注册!

        a.整个过程中页面没有刷新,只是局部刷新了;

        b.在请求发出后,浏览器不用等待服务器响应结果就可以进行其他操作;

      4.AJAX的优缺点

        优点:

          1.AJAX使用JavaScript技术向服务器发送异步请求;

          2.AJAX请求无须刷新整个页面;

          3.因为服务器响应内容不再是整个页面,而是页面中的部分内容,所以AJAX性能高;

     

    例子:一个登陆认证页面,登陆失败不刷新页面,提示用户登陆失败,登陆成功自动跳转到网站首页。

    # html页面:
    {% 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>
    {#<form action="{% url 'login' %}" method="post" >#}
    {#    {% csrf_token %}#}
    {#    用户名: <input type="text" name="username">#}
    {#    密码: <input type="password" name="password">#}
    {#    <input type="submit">#}
    {##}
    {#</form>#}
        {% csrf_token %}
        用户名: <input type="text" id="username">
        密码: <input type="password" id="password">
        <button id="sub" >提交</button>
        <span id="error" style="color: red;, font-size: 12;"></span>
    </body>
    <script src="{% static 'js/jquery.js' %}"></script>
    <script>
        $('#sub').click(function () {
            var name = $('#username').val();
            var pw = $('#password').val();
            var csrf_token = $('input[name=csrfmiddlewaretoken]').val();
    
            $.ajax({
                url: {% url 'login' %},   # 向哪里提交数据
                type: 'post',             # 提交数据的方式
                data:{'uname':name, 'pwd':pw, 'csrfmiddlewaretoken':csrf_token},   # 提交的数据 /object类型, 键值形式,键可以不加引号
                success: function (response) {    # response: 形参, 
                    if(response.status){
                        $('#error').text('成功了');
                        location.href = response.home_url;
                    }else{
                        $('#error').text('失败了');
                    }
                }
    
            })
        })
    
    </script>
    
    </html>
    # views.py
    from django.shortcuts import render, HttpResponse, redirect
    from app01 import models
    from django.http import JsonResponse
    from django.urls import reverse
    import json
    
    
    # Create your views here.
    
    
    
    def login(request):
        if request.method == "GET":
            return render(request, 'login.html')
        else:
            # form 表单提交数据
            # uname = request.POST.get('username')
            # pwd = request.POST.get('password')
            # print(uname, pwd)
            # return HttpResponse('ok')
    
            a = {'status': None, 'home_url': None}
            uname = request.POST.get('uname')
            pwd = request.POST.get('pwd')
            print(uname, pwd)
    
    
            ret = models.UserInfo.objects.filter(name=uname, pwd=pwd)
            if ret.exists():
                a['status'] = True
                a['home_url'] = reverse('home')
                a_json = json.dumps(a)
                # return HttpResponse(a_json, content_type='application/json')
                return JsonResponse(a )
            else:
                return HttpResponse('file')
    
    
    def home(request):
    
    
            return render(request, 'home.html')
    # 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'^login/', views.login, name='login'),
        url(r'^home/', views.home, name='home'),
    
    
    ]

    登陆失败:

    登陆成功:(会跳转到home页面)

  • 相关阅读:
    hmac模块和hashlib模块
    logging模块
    sys模块
    datetime模块
    time模块
    例题:100节楼梯,0-49节,分数等于节数。50节(包括50节)以后每节10分。输入节数,得出分数。这个题如果按照讲页来做是错误的,所以再写一遍,请大家指导
    C# .ToString() 格式化
    例题:判断平年还是闰年。理解使用异常语句try catch finally 和datetime 时间类
    SQL Server第一堂课:创建数据库,创建表,以及表中最基本的增,删,改
    例题:输入学生的各项资料,然后根据学生的分数,重新排序。重新复习结构体,集合,数组,for循环,冒泡排序,水平符的使用。
  • 原文地址:https://www.cnblogs.com/q455674496/p/10478335.html
Copyright © 2020-2023  润新知