Flask表单处理

2108 字
6 分钟

每日一言

All meetings must end with partings. — Dera Mochimazzi from Tamako Market

创建表单

首先我们创建一个html表单内容如下:

<!DOCTYPE html>
<html>
<head>
    <title>Form Example</title>
</head>
<body>
    <form action="/submit" method="post">
        <label for="name">Name:</label>
        <input type="text" id="name" name="name">
        <br>
        <label for="email">Email:</label>
        <input type="email" id="email" name="email">
        <br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>
  • action="/submit":表示将表单提供到路径 /submit
  • method="post":表示提交方式为 post

样式如下:

1740965506919

Flask接收数据

要获取从表单提取的数据,首先完美需要从flask中导入request

from flask import request
from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/')
def form():
    return render_template('form.html')

@app.route('/submit', methods=['POST'])	#设置form提交数据的路由
def submit():
    name = request.form.get('name') #这里填入参数对应html中的name属性
    email = request.form.get('email')#这里填入参数对应html中的name属性
    return f'Name: {name}, Email: {email}'  #提交表单后自动跳转到/submit路径

if __name__ == '__main__':
    app.run(debug=True)

提交表单后,浏览器会自动跳转到 /submit路径,同时触发 submit视图函数。若不需要让用户看自己提交的数据,可以使用重定向回到主页,或者你需要的位置

@app.route('/submit', methods=['POST'])	#设置form提交数据的路由
def submit():
    name = request.form.get('name') #这里填入参数对应html中的name属性
    email = request.form.get('email')#这里填入参数对应html中的name属性
    return redirect(url_for('/'))	#重定向到首页

文件上传

templates/upload.html 文件代码:

<!DOCTYPE html>
<html>
<head>
    <title>Upload File</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <label for="file">File:</label>
        <input type="file" id="file" name="file">
        <br>
        <input type="submit" value="Upload">
    </form>
</body>
</html>
  • enctype="multipart/form-data":表示不对字符编码,用于文件上传
    • application/x-www-form-urlencoded(默认值)- 所有字符会被编码

处理文件上传

from flask import Flask, request, redirect, url_for,render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('upload.html')


@app.route('/upload', methods=['POST'])
def upload():
    file = request.files.get('file')	#html中的name属性
    if file:
        filename = file.filename
        file.save(f'app/uploads/{filename}')	#此处路径为工作目录下的相对路径,而非flask应用的相对路径
        return f'File uploaded successfully: {filename}'
    return 'No file uploaded'

if __name__ == '__main__':
    app.run(debug=True)

Flask-WTF扩展

在很多教程中都使用的Flask-WTF扩展用于对表单进行处理,但是本系列flask笔记只想围绕最基本的flask框架进行初步学习,后续如果需要用到WTF扩展会再补充该部分。但是希望能够知道这样一个东西存在。