python
主页 > 脚本 > python >

Flask如何接收前端ajax传来的表单(包含文件)

2023-08-27 | 佚名 | 点击:

Flask接收前端ajax传来的表单

HTML,包含一个text类型文本框和file类型上传文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

<!DOCTYPE html>

<html lang="en">

 

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <meta http-equiv="X-UA-Compatible" content="ie=edge">

    <title>拍照</title>

</head>

 

<body>

    <h1>拍照上传演示</h1>

    <form id="upForm" enctype="multipart/form-data" method="POST">

        <p>

            <span>用户名:</span>

            <input type="text" name="username" />

        </p>

        <input name="pic" type="file" accept="image/*" capture="camera" />

        <a onclick="upload()">上传</a>

    </form>

    <img id="image" width="300" height="200" />

</body>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

<script>

    function upload() {

        var data = new FormData($("#upForm")[0]);   //注意jQuery选择出来的结果是个数组,需要加上[0]获取

        $.ajax({

            url: '/do',

            method: 'POST',

            data: data,

            processData: false,

            contentType: false,

            cache: false,

            success: function (ret) {

                console.log(ret)

            }

        })

      //return false    //表单直接调用的话应该返回false防止二次提交,<form οnsubmit="return upload()">

    }

</script>

 

</html>

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

import os

from flask import Flask, render_template, request, jsonify

from werkzeug import secure_filename

 

TEMPLATES_AUTO_RELOAD = True

 

app = Flask(__name__)

app.config.from_object(__name__)

# 设置Flask jsonify返回中文不转码

app.config['JSON_AS_ASCII'] = False

 

PIC_FOLDER = os.path.join(app.root_path, 'upload_pic')

 

 

@app.route('/', methods=['GET'])

def hello():

    return render_template('index.html')

 

 

@app.route('/do', methods=['POST'])

def do():

    data = request.form

    file = request.files['pic']

    result = {'username': data['username']}

    if file:

        filename = secure_filename(file.filename)

        file.save(os.path.join(PIC_FOLDER, filename))

        result['pic'] = filename

 

    return jsonify(result)

 

 

if __name__ == '__main__':

    app.run(debug=False, host='0.0.0.0', port=8000)

Flask利用ajax进行表单请求和响应

前端html代码

1

2

3

4

<form id="demo_form">

    输入框: <input type="text" name="nick_name" />

    <input type="submit" value="ajax请求"/>

</form>

js代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

//首先需要禁止form表单的action自动提交

$("#demo_form").submit(function(e){

    e.preventDefault();

 

    $.ajax({

        url:"/demo",

        type:'POST',

        data: $(this).serialize(),   // 这个序列化传递很重要

        headers:{

            "X-CSRF-Token": getCookie('csrf_token')

        },

        success:function (resp) {

            // window.location.href = "/admin/page";

            if(resp.error){

                console.log(resp.errmsg);

            }

        }

    })

});

python Flask框架的代码

1

2

3

4

5

@app.route("/demo", methods=["POST"])

def demo():

    nick_name = request.form.get("nick_name")

    print(nick_name)

    return "ok"

表单序列化很重要,否则获取的数据是None。

原文链接:
相关文章
最新更新