zoukankan      html  css  js  c++  java
  • python+ajax+flas框架的简单Ajax的笔记

    执行原理:浏览器请求初始界面IP地址,python后端flas框架路由返回主页HTML,当用户输入账号和密码,前端HTML通过Ajax发送账号密码请求后端正接口,,接口逻辑验证成功返回数据且封装请求头信息,防止不同源问题。

    前端:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <meta http-equiv="Content-Type" />
    <script src="Js/jquery-1.8.0.js"></script>  <!--引用根目录的Js文件下的公共jquery-3.4.1.min.js文件。Ajax需要这个文件 -->
    <script src="Js/login.js"></script> <!--js文件,里面定义了动作-->
    <title>牛大爷管理云系统</title>
    <link href="Css/login.css" rel="stylesheet" type="text/css" /> <!--引用根目录的Css下的login.css布局cs文件-->
    </head>
    <body>
        <div id="login">
            <!--上方的布局,欢迎图片 -->
             <div id="top">
                  <div id="top_left"><img src="images/login_03.gif" /></div>
                  <div id="top_center"></div>
             </div>
             <div id="center">
                 <!-- 登入界面的布局 -->
                  <div id="center_left"></div>
                  <div id="center_middle">
                    <div  id="biaoqian"></div>
                       <div id="user">账   户  
                         <input  id="userv" type="text" name="textfield" value="请输入您的账号" />
                       </div>
                       <div id="password">密   码
                         <input id="passwordv" type="password" name="textfield2"  value="" />
                       </div>
                       <div id="btn" ><a id="lg">登录</a> <a id="del">清空</a></div> <!--登入按钮的id是lg,在js文件中对这个id有单独的触发设置--            
                  </div>
                  <div id="center_right"></div>      
             </div>
             <div id="down">
                  <div id="down_left">
                      <div id="inf">
                           <span class="inf_text">系统版本</span>
                           <span class="copyright">牛大爷管理系统 2019 v1.0</span>
                      </div>
                  </div>
                  <div id="down_center"></div>       
             </div>

        </div>
    </body>
    </html>

    前端html界面就是个简单的登入界面。
    接下来对登入按钮设置js的动作,当用户点击登入按钮时触发,Ajax将获取HTML上的账号和密码并发送请求到验证接口。
    js文件:

    //<script src="Js/jquery-3.4.1.min.js"></script> 这段在HTML中引用了,所以js文件中不需再次引用
    // 登录的触发
    $(document).ready(function(){ //定义js函数
        $("#lg").click(function(){ //#代表类型是id,意思是当id为lg元素被click点击时触发这个函数内容
        //验证账号密码是否为空,我做了简单验证,先判断账号密码是否为空。
            if ( $("#userv").val()=="请输入您的账号"){ //如果id为userv的元素的值(val)等于 “请输入您的账号”这个字符串
                $("#biaoqian").html("账号不能为空"); //那就将id为biaoqian的元素值(这里是标签p,所以更给他的值用.html函数)更改。用来提示效果
                }
            else {
                    if ( $("#passwordv").val()==""){
                        $("#biaoqian").html("密码不能为空");
                     }else { //如果账号和密码都不为空,那么我们就开始用Ajax请求验证
                        // POST一个json数据
     
                        var na = $("#userv").val(); //定义变量 na代表账号的值 $是代表继承jQuery的方法
                        var pw = $("#passwordv").val();
                        var daa={"name":na,"pwd":pw} //这里将账号和密码拼装成字典格式,方便后端接口接收读取
                        //alert("开始登入账户"+na+"开始登入密码"+pw);
                            $.ajax({ //Ajax框架结构
                                        type: "POST", //定义请求类型
                                        url:"http:/xxxxx:8088/login", //请求接口路径
                                        data:daa, //发送的数据
                                        //contentType:"application/json;charset=UTF-8",
                                        Type:"json", //定义接收返回数据的类型
                                        success:function(data) {  //请求成功会执行这个函数
                                            //var sev = JSON.parse(data);
                                            var c=data.code; //读取响应数据中code的值
                                                                // alert("响应数据"+ c.value);
                                            if (c==0001){ //如过响应的值是0001 让p标签提示相应信息,这个响应值也是前后端约定好的
                                                $("#biaoqian").html("用户名或密码错误"); //需要用html函数改变p标签内容 vel只适合更改文本
                                            }else if(c==0002){
                                                $("#biaoqian").html("该用户未注册");
                                            }else if(c==2000){
                                                $("#biaoqian").html("登入成功");
                                                window.location.href="./index.html";
                                            }else if(c==5000){
                                                $("#biaoqian").html("服务器故障");
                                            }
                                                                },
                                        error:function(xhr,type){
                                            alert(JSON.stringify(xhr),JSON.stringify(type));
                                                            }
                                    });   
                            }
                 }              
        });
      });
    // 清空按钮触发 后期改成注册
    $(document).ready(function(){
        $("#del").click(function(){
            $("#userv").val("请输入您的账号");
            $("#passwordv").val("");
            $("#biaoqian").html("");
        });
      });

    // 获得焦点清空初始提示语逝去焦点值为空则恢复初始提示语
    $(document).ready(function(){
      $("#userv").focus(function(){
        $(this).val("");
        $("#biaoqian").html("");
      });
      $("#userv").blur(function(){
         if ($(this).val() =='')
         {
             $(this).val("请输入您的账号");
             $("#biaoqian").html("");
         }; 
      });
    });

    后端python文件:
    #!/usr/bin/env python
    import time
    from flask import Flask,jsonify,request,make_response
    import json
    import socket
    import random
    import urllib.parse
    import pymysql
    from flask import Response
    def sqldo(sql): #定义个执行连接数据库的函数
        # 打开数据库连接
        db =  pymysql.connect("数据库IP","用户账号","密码","需要链接的库名" )
        # 使用 cursor() 方法创建一个游标对象 cursor
        cursor = db.cursor()
        sq=sql
        # 使用 execute()  方法执行 SQL 查询 
        cursor.execute(sq) 
        # 使用 fetchone() 方法获取单条数据.
        data = cursor.fetchone() 
        return data
        # 关闭数据库连接
        db.close()
    #创建一个flask服务,赋值给APP
    app = Flask(__name__)
    #指定接口访问的路径,仅支持post请求方式,这段代码意思是当访问/login路径就会执行下面的这个函数
    @app.route('/login',methods=['POST'])
    #登入系统验证接口
    def login():    
        #获取接到的数据
        print("接收请求")
        #data = request.get_json()
        data = request.form #因为Ajax发送的是post请求所以这里用from函数获取请求数据
        print('请求的数据是',data,"请求模式是",request.method)
        #print('用户名是',data['name'])
        if len(data)  <= 1: #如果请求数据小于1 证明他没数据
            print ('请求为空')
            #接收的请求时空则包0000
            da ={"code":"5000"}
        else: #如果请求数据不为空,咱们就开始验证账户密码
            sql= 'select * from user where name="' + data['name'+ '"' #构建sql语句,查寻这个账号的数据,用字符串拼接方式组合,这样灵活变通
            #print ('sql语句是',sql)
            try: #加个异常,执行sql语句,出错还可以提示,方便调试
                das= sqldo(sql) #sqldo是上面定义的查询数据库函数执行查询并将结果赋值给das
                print(das)
            except:
                #数据库异常返回5000
                da = {"code":"5000"}
            if  das == None: #如果值为空证明数据库没这个用户
                print('判断为空')
                #用户未注册返回0002
                da = {"code":"0002"}
            elif das[1]==data['pwd']: #如果查询数据库的值不为空,证明他注册了那我们来验证密码。根据数据结构数据库返回的是元组结构,das[1]第2个值是密码
               #登入成功2000
                da ={"code":"2000","name":'"'+das[0]+'"'} #依然用字符串拼接,密码正确返回 code码和这个用户名子。就是das[0]
            else: #否则那就是密码错误了呗
                print('密码错误')
                #密码错误 0001
                da = {"code":"0001"}
        rst = make_response(da) #将code的码封装响应信息
        rst.headers['Access-Control-Allow-Origin'="*" #给响应信息添加信息头 *代表所有都可以访问 可以跨域请求
        rst.headers['Access-Control-Allow-Methods'="POST" #指定请求的模式post
        print('响应数据是:',rst)
        return rst #返回数据rst 这样 Ajax就会接收到数据
    app.run(host='0.0.0.0',port=8088,debug=True) #程序 主入口 prot可以自定义访问端口,debug如果是True就代表室是更新,代码更改程序也直接更行

    #debug:调试的时候,可以指定debug=true;如果是提供接口给他人使用的时候,debug要去掉



























     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    THUSC & 中考 & NOI 拉跨记
    Spring Security中的密码安全
    Spring Security 中的 CSRF和CORS
    Jacoco代码覆盖率
    Kafka拦截器
    shell遍历多个数组
    shell中的函数
    SpringSecurity权限控制
    SpringSecurity的@EnableWebSecurity注解
    SpringBoot配置自定义包扫描
  • 原文地址:https://www.cnblogs.com/amuchen/p/12306313.html
Copyright © 2011-2022 走看看