RSS
菜单
全部文章快讯开发科技深度热点

Flask从零到精通|第4课:request对象、获取表单数据与文件上传

内容摘要

# Flask从零到精通|第4课:request对象、获取表单数据与文件上传。> 前置:路由、模板、Jinja2已经掌握。本节课核心:接收前端浏览器提交的数据。## 📖 本节课目标。1. 导入并掌握 `request` 对象。2. GET请求获取URL查询参数(`request.args`)。

# Flask从零到精通|第4课:request对象、获取表单数据与文件上传

> 前置:路由、模板、Jinja2已经掌握。本节课核心:接收前端浏览器提交的数据。

## 📖 本节课目标

1. 导入并掌握 `request` 对象

2. GET请求获取URL查询参数(`request.args`)

3. POST表单提交,获取表单数据(`request.form`)

4. 了解 `request` 常用属性:method、remote_addr

5. 实现文件上传功能 `request.files`

6. flash消息提示(一次性弹窗消息)

## 4.1 request介绍

`request` 是Flask封装的请求对象,封装了浏览器发来的全部请求信息。

需要导入:

```

from flask import Flask, render_template, request, flash

```

### request常用属性

- `request.method`:获取当前请求方式 `GET` / `POST`
- `request.args`:获取url问号后面的查询参数(GET参数)
- `request.form`:获取POST提交的表单数据
- `request.files`:获取上传文件
- `request.remote_addr`:获取客户端IP地址

## 4.2 GET参数获取 request.args

访问地址示例:`[

```

@app.route('/search')
def search():
    # get方法:key不存在不会报错,返回None
    keyword = request.args.get("keyword")
    page = request.args.get("page", default=1, type=int)
    return f"搜索关键词:{keyword},页码:{page}"

```

>

> 重点:**一定要用 .get()**,直接 `request.args['keyword']` 参数不存在会直接报错。

## 4.3 POST表单提交 request.form

### app.py 路由

```

@app.route('/login', methods=["GET", "POST"])
def login():
    if request.method == "POST":
        # POST提交表单,读取表单字段
        username = request.form.get("username")
        password = request.form.get("password")
        return f"用户名:{username}, 密码:{password}"
    # GET请求:返回登录表单页面
    return render_template("login.html")

```

### templates/login.html 表单页面

```

{% extends "base.html" %}

{% block title %}登录{% endblock %}

{% block content %}
<h2>用户登录</h2>
<!-- action="" 提交到当前路由;method="post" -->
<form action="" method="post">
    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="submit" value="登录"></p>
</form>
{% endblock %}

```

>

> 关键点:表单input的 `name` 属性,就是后端取数据的key,**没有name后端拿不到值!**

## 4.4 flash 一次性消息提示(消息闪现)

场景:登录成功/失败提示,刷新页面消息自动消失。

⚠️ flash必须配置 `secret_key`,否则报错!

app.py增加配置

```

app = Flask(__name__)
# 必须设置secret_key,用于会话和flash加密
app.secret_key = "abc123456mysecretkey"

```

修改login视图函数

```

@app.route('/login', methods=["GET", "POST"])
def login():
    if request.method == "POST":
        username = request.form.get("username")
        password = request.form.get("password")
        if username == "admin" and password == "123456":
            flash("登录成功!")
        else:
            flash("用户名或密码错误!")
    return render_template("login.html")

```

在模板里渲染flash消息(放到login.html)

```

{% with messages = get_flashed_messages() %}
  {% if messages %}
    <ul>
      {% for msg in messages %}
        <li style="color:red">{{ msg }}</li>
      {% endfor %}
    </ul>
  {% endif %}
{% endwith %}

```

## 4.5 文件上传 request.files

### app.py

```

@app.route('/upload', methods=["GET", "POST"])
def upload():
    if request.method == "POST":
        # 获取上传文件对象
        f = request.files.get("avatar")
        if f:
            # 保存文件,保存到static目录
            f.save("static/upload/" + f.filename)
            flash("文件上传成功")
    return render_template("upload.html")

```

>

> 先手动创建文件夹 `static/upload`

templates/upload.html

```

{% extends "base.html" %}

{% block title %}文件上传{% endblock %}

{% block content %}
<h2>上传头像</h2>
<form method="post" enctype="multipart/form-data">
    <input type="file" name="avatar">
    <input type="submit" value="上传">
</form>
{% endblock %}

```

>

> ⚠️ 文件上传表单必须加 `enctype="multipart/form-data"`,否则后端拿不到文件!

## ✅ 完整app.py

```

from flask import Flask, render_template, request, flash

app = Flask(__name__)
app.secret_key = "abc123456mysecretkey"

@app.route('/search')
def search():
    keyword = request.args.get("keyword")
    page = request.args.get("page", default=1, type=int)
    return f"搜索关键词:{keyword},页码:{page}"

@app.route('/login', methods=["GET", "POST"])
def login():
    if request.method == "POST":
        username = request.form.get("username")
        password = request.form.get("password")
        if username == "admin" and password == "123456":
            flash("登录成功!")
        else:
            flash("用户名或密码错误!")
    return render_template("login.html")

@app.route('/upload', methods=["GET", "POST"])
def upload():
    if request.method == "POST":
        f = request.files.get("avatar")
        if f:
            f.save("static/upload/" + f.filename)
            flash("文件上传成功")
    return render_template("upload.html")

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

```

## 📝 本节课小结

1. `request.args`:获取URL查询参数(GET)

2. `request.form`:获取POST表单数据;表单input必须写name

3. `request.files` 获取上传文件;表单必须 `enctype="multipart/form-data"`

4. flash 闪现消息,依赖 `secret_key`,消息只显示一次

5. `request.method` 判断请求方式

## 🧪 练习任务

1. 访问 `/search?keyword=flask教程` 获取参数

2. 测试登录表单,输入正确/错误账号查看flash提示

3. 上传一张图片,确认保存到static/upload目录

— 全文完 —回到顶部 ↑
下载推广海报

文章推广海报

《Flask从零到精通|第4课:request对象、获取表单数据与文件上传》完整推广海报
DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。