# 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目录
文章回复
0 条公开回复