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要去掉



























 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/amuchen/p/12306313.html