zoukankan      html  css  js  c++  java
  • flask前端与后端之间传递的两种数据格式:json与FormData

    json格式

    双向!
    前端 ==>后端:json格式
    后端 ==>前端:json格式

    html

    <!-- html部分 -->
    <form enctype='application/json' method="post">
        <input type="text" name="username" placeholder="请输入用户名"/></br>
        <input type="text" name="password" placeholder="请输入密码"/></br>
        <button type="submit">登录</button>
    </form>
    
    <!-- 用户列表,用于显示新增的用户 -->
    <ol id="container"></ol>
    
    <!-- javascript部分 -->
    <script>
    var container = document.getElementById('container');
    // 辅助函数:将一个新添加的用户(user),放入form的下方容器的尾部显示
    var show_added_user = function (user) {
        var li = document.createElement("li");
        li.innerText = user["id"] + " " + user["username"] + ":" + user["password"];
        container.appendChild(li);
    };
    
    
    // 将formData数据转换为json数据,版本一
    var convert_FormData_to_json = function (formData) {
        var objData = {};
        for (var entry of formData.entries()){objData[entry[0]] = entry[1];}
        return JSON.stringify(objData);
    };
    
    // 将formData数据转换为json数据,版本二(箭头语法)
    var convert_FormData_to_json2 = function (formData) {
        var objData = {};
        formData.forEach((value, key) => objData[key] = value);
        return JSON.stringify(objData);
    };
    
    
    var formobj = document.querySelector('form');
    //var formobj = document.getElementByTag('form');
    formobj.addEventListener('submit', function(event){
        event.preventDefault();
        
        var xhr = new XMLHttpRequest();
        xhr.open('POST', '/users/');
        
        xhr.setRequestHeader('Content-Type', 'application/json'); // (前端)声明json格式
        xhr.send(convert_FormData_to_json(new FormData(formobj)));// (前端)发送json数据
        xhr.addEventListener('loadend', function() {
            if(xhr.status == 201){ // 201,去看app.py!!
                var user = JSON.parse(xhr.responseText);          // (前端)处理接收的json数据
                show_added_user(user)
                //users.map(show_added_user); // 如果返回users list,则可用map!!
            }
        }, false);
    }, false);
    </script>
    

    app.py

    # app.py
    # 查询
    @app.route('/users', methods=['GET'])
    def show_user(user_id):
        users = User.query.all()    
        return jsonify(users)                                                           # (后端)发送json数据
    
    # 查询一个
    @app.route('/users/<int:user_id>', methods=['GET'])
    def show_user(user_id):
        user = User.query.filter_by(id=user_id).first()    
        return jsonify(user)                                                            # (后端)发送json数据
        
    # 添加
    @app.route('/users/', methods=['POST'])
    def add_user():
        username, password = request.json['username'], request.json.get('password', "") # (后端)处理接收的json数据
        user = User(username, password) # 自动多了id
        db.session.add(user)
        db.session.commit()
        return jsonify(user), 201                                                       # (后端)发送json数据
    

    FormData格式

    单向!
    前端 ==>后端:FormData格式
    后端 ==>前端:json格式

    html

    <!-- html部分 -->
    <form enctype='application/x-www-form-urlencoded' method="post"> <!-- 编码传送 -->
    <!-- 或者:<form enctype='multipart/form-data' method="post"> --> <!-- 不编码传送,特别是当包含文件上传控件时,必须用这个! -->
        <input type="text" name="username" placeholder="请输入用户名"/></br>
        <input type="text" name="password" placeholder="请输入密码"/></br>
        <button type="submit">登录</button>
    </form>
    
    <!-- 用户列表 -->
    <ol id="container"></ol>
    
    <!-- javascript部分 -->
    <script>
    var container = document.getElementById('container');
    // 辅助函数:将一个新添加的用户(user),放入form的下方容器的尾部显示
    var show_added_user = function (user) {
        var li = document.createElement("li");
        li.innerText = user["id"] + " " + user["username"] + ":" + user["password"];
        container.appendChild(li);
    };
    
    
    var formobj = document.querySelector('form');
    //var formobj = document.getElementByTag('form');
    
    formobj.addEventListener('submit', function(event){
        event.preventDefault();
        
        var xhr = new XMLHttpRequest();
        xhr.open('POST', '/users/');
        
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // (前端)声明form格式 注意这里对应前面:application/x-www-form-urlencoded
        xhr.send(new FormData(formobj));                                           // (前端)发送form数据
        xhr.addEventListener('loadend', function() {
            if(xhr.status == 201){ // 201,去看app.py!!
                var user = JSON.parse(xhr.responseText);                           // (前端)处理接收的json数据
                show_added_user(user)
                //users.map(show_added_user); // 如果返回users list,则可用map!!
            }
        }, false);
    }, false);
    </script>
    

    app.py

    # app.py
    # 查询
    @app.route('/users', methods=['GET'])
    def show_user(user_id):
        users = User.query.all()    
        return jsonify(users)                                                           # (后端)发送json数据
    
    # 查询一个
    @app.route('/users/<int:user_id>', methods=['GET'])
    def show_user(user_id):
        user = User.query.filter_by(id=user_id).first()    
        return jsonify(user)                                                            # (后端)发送json数据
        
    # 添加
    @app.route('/users/', methods=['POST'])
    def add_user():
        username, password = request.form['username'], request.form.get('password', "") # (后端)处理接收的form数据
        user = User(username, password) # 自动多了user_id
        db.session.add(user)
        db.session.commit()
        return jsonify(user), 201                                                       # (后端)发送json数据
    
  • 相关阅读:
    Redis常用命令详细介绍(摘抄)
    线性表和链表
    TCP传输连接中的SYN、ACK、SEQ、AN分别是什么意思?他们所带的数字又是代表什么?
    redis默认有16个数据库
    常见问题
    jquery-table2excel 不导出列(隐藏列,或指定列)
    AngularJS 防止页面闪烁的方法
    如何做好需求分析
    IIS 一个服务器下不同站点操作共享文件夹
    批量修改 mysql数据库编码格式(Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='格式错误)
  • 原文地址:https://www.cnblogs.com/hhh5460/p/8411978.html
Copyright © 2011-2022 走看看