ajax

1、什么是ajax?

  1.AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

  2.AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

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

2、ajax与传统开发模式的区别:

  ajax开发模式:页面将用户的操作通过ajax引擎与服务器进行通信,将返回的结果给ajax引擎,然后ajax将数据插入指定位置。

  传统的开发模式:用户的每一次操作都触发一次返回服务器的HTTP请求,服务器做出处理后,返回一个html页面给用户。

3、ajax的使用:

1、ajax发送字符串数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <script type="text/javascript" src="../static/js/jquery-1.12.4.min.js"></script>
    <script type="text/javascript" src="../static/js/main.js"></script>
</head>
<body>

<form method="post" enctype="multipart/form-data" id = "add_form">

    用户名:<input type="text" name="name" id="name">
    <br>

    邮箱:<input type="text" name="email" id = "email">
    <br>

    密码:<input type="text" name="pwd" id = "pwd">
    <br>

    确认密码:<input type="text" name="pwd1" id = "pwd1">
    <br>

    手机号:<input type="text" name="phone" id = "phone">
    <br>

    身高:<input type="text" name="height" id = "height">
    <br>

    图  片:<input type="file" name="picture1" id = "picture1">
    <br>


    <input type="submit" id = "regist">


</form>

<script>
    $(function () {
        $("#regist").click(function () { 
            {#用标签选择器获取需要的值#}
            var name = $("#name").val();   
            var email = $("#email").val();
            var pwd = $("#pwd").val();
            var pwd1 = $("#pwd1").val();
            var phone = $("#phone").val();
            var height = $("#height").val()
                {#发送ajax请求#}
                .ajax({
                    url:"/user/add",  
                    type:"post",
                    data:{"name":name,
                          "email":email,
                          "phone":phone,
                          "pwd":pwd,
                          "pwd1":pwd1,
                          "height":height},
                    {#成功后执行的函数#}
                    success:function (res) {
                        if (res.code == 200){
                            {#重定向#}
                            window.location.href="/user/login"
                        }else {
                            alert(res.message)
                        }
                    {#失败后执行的函数    #}
                    error:function f() {
                        alert("添加失败,请重新添加");
                        window.location.href="/user/add"
                        }
                    }
                })

        })

    })



</script>

</body>
ajax发送数据给后端
def adduser():

    if request.method =="POST":
        name = request.form.get("name")
        pwd = request.form.get("pwd")
        pwd1 = request.form.get("pwd1")
        email = request.form.get("email")
        phone = request.form.get("phone")
        height = request.form.get("height")
        picture1 = request.files.get("picture1")
        print(picture1,name)



        # print(name,pwd,pwd1,email,phone,height)

        if not all([name,pwd,pwd1,email,phone,height]):
            flash("数据不完整,添加完整")

        role_phone = r'1[d]{10}$'
        role_email = r"[w]+@[w]+.[a-z]{2,3}$"

        result_phone = re.match(role_phone,phone)

        result_email = re.match(role_email,email)

        if not result_email:
            flash("邮箱格式不正确,请检查")
            return redirect("/user/add")

        if not result_phone:
            flash("手机号有误,请检查")
            return redirect("/user/add")

        if  pwd != pwd1:
            flash("两次密码不一致,请检查")
            return redirect("/user/add")

        flag = False
        try:
            # print(1111111)
            print(type(phone),type(height),type(pwd),type(email),type(pic_filename))
            user1 = User(name=name,email=email,password=pwd,phone=phone,height= int(height),pic_name = pic_filename)
            db.session.add(user1)
            db.session.commit()
            # print(22222222)
            if user1:
                flag =True

        except Exception as e:
            # raise e
            db.session.rollback()
            flash("添加失败,重新添加")
            return redirect("/user/add")


        if flag:
            return redirect("/user/show")

    return render_template("adduser.html")
后端处理ajax请求

2、ajax发送文件数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加图片</title>
    <script type="text/javascript" src="../static/js/jquery-1.12.4.min.js"></script>
    <script type="text/javascript" src="../static/js/main.js"></script>
</head>
<body>

<form enctype="multipart/form-data" id="uploadForm">
      <input type='file' name='xxx' id='pic_img'>
      <input type='button' onclick='upload()' value='点击上传'>
 </form>

</body>

<script>
    function upload(){
    var formData = new FormData($("#uploadForm")[0])  //创建一个forData
    formData.append('img', $('#pic_img')[0].files[0]) //把file添加进去  name命名为img
    $.ajax({
        url: "/add/picture",
        data:formData,
        type: "POST",
        async: false,
        {#当async属性的值为false时是同步的,Ajax请求将整个浏览器锁死,只有ajax请求返回结果后,才执行ajax后面的alert语句。#}
        {#当async属性的值为true时是异步的,即不会等待ajax请求返回的结果,会直接执行ajax后面的alert语句。#}
        cache: false,
        {#cache:true 如果当前请求有缓存的话,直接使用缓存。如果该属性设置为 false,则每次都会向服务器请求#}
        contentType: false,
        {#我们在 form 标签中设置了enctype = “multipart/form-data”,这样请求中的 contentType 就会默认为 multipart/form-data 。
        而我们在 ajax 中 contentType 设置为 false 是为了避免 JQuery 对其操作,从而失去分界符,而使服务器不能正常解析文件。#}
        processData: false,
        {#发送的数据将被转换为对象(从技术角度来讲并非字符串)以配合默认内容类型"application/x-www-form-urlencoded"。#}
        {#如果要发送DOM树信息或者其他不希望转换的信息,请设置为false#}
        success: function(data) {
             if (data.code == 200) {
                 alert("success")
             }
        },
        error: function() {
              //失败
            alert("fail ")
        }
      })
}


</script>


</html>
ajax发送文件数据
@addinfo.route("/add/picture",methods = ["POST","GET"])
def add_picture():
    if request.method == "POST":
        picture1 = request.files.get("img")
        pic_filename = picture1.filename
        pic_filename_list = pic_filename.split(".")
        pic_filename_list[0] = pic_filename_list[0] + str(int(time.time()))
        pic_filename = ".".join(pic_filename_list)

        path = basepath + "/static"
        upload_path = os.path.join(path, pic_filename)
        picture1.save(upload_path)
        message= {
            "code":200
        }

        return jsonify(message)
    else:
        message = {
            "code": 500
        }
        return jsonify(message)
后端获取数据

3.ajax分页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>展示</title>
    <script type="text/javascript" src="/static/js/jquery-1.12.4.min.js"></script>
    <script type="text/javascript" src="/static/js/jquery.pagination.min.js"></script>

</head>
<body>

<table border="1" cellspacing="0">
    <div>
    <tr>
        <td>用户名</td>
        <td>邮箱</td>
        <td>手机号</td>
        <td>身高</td>
        <td>图片</td>
        <td>操作</td>
    </tr>

    {% for user in users %}

        <tr>
            <td>{{ user.name }}</td>
            <td>{{ user.email }}</td>
            <td>{{ user.phone }}</td>
            <td>{{ user.height }}</td>
            <td><img src="{{ url_for('static', filename= user.pic_name) }}" width="400" height="400" alt="图片加载失败 "></td>

            <td>
                <a href="">编辑</a>
                <a href="">删除</a>
            </td>
        </tr>
    {% endfor %}
    </div>
</table>

<br>
<br>


<div id="pagination" class="page"></div>

<script>
        // 调用父页面的方法改变菜单指示
        // window.parent.fnChangeMenu(2);
        $(function () {
            $("#pagination").pagination({
                currentPage: {{ page }},
                totalPage: {{ total_page }},
                //当点击页码链接时,会执行如下函数
                callback: function (current) {
                    //参数current表示当前链接代表的页码值
                    //不写地址表示当前地址,即当前为新闻列表地址
                    //?page=1
                    location.href='?page='+current;
                }
            });
        });
</script>
</body>
</html>
ajax分页
@showuser.route("/user/show")
@check_login
def showinfo():

    page = int(request.args.get('page', '1'))
    pagination = User.query.filter_by().paginate(page, 2, False)
    user_list = pagination.items
    total_page = pagination.pages
    return render_template("showinf.html",users=user_list,
        total_page=total_page,
        page=page)
后端数据
原文地址:https://www.cnblogs.com/jxhp/p/13440716.html