表单与请求数据
处理用户输入
表单与请求数据 是 CoddyKit 上的免费 Python Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
request 对象
Flask 会让每个视图都能访问一个全局 request 对象,其中包含所有传入数据:表单字段、查询字符串、JSON、请求头等。
from flask import Flask, request
app = Flask(__name__)
# request is available inside any view
print('request carries the incoming data')查询字符串参数
URL 中 ? 后面的数据位于 request.args 中。使用 .get() 可以安全地读取值。
from flask import Flask, request
app = Flask(__name__)
@app.route('/search')
def search():
term = request.args.get('q', '')
return 'Searching for ' + term
print('/search?q=cats -> request.args')HTML 表单
表单提交时会发送数据。method 和 action 属性决定发送方式和目标位置。
# <form method='POST' action='/login'>
# <input name='username'>
# <input name='password' type='password'>
# <button>Submit</button>
# </form>
print('Form posts username and password')读取表单数据
提交的表单字段会出现在 request.form 中。请通过输入项的 name 属性访问它们。
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
user = request.form['username']
return 'Welcome ' + user
print('request.form holds posted fields')使用 get 安全访问
使用 request.form['x'] 时,如果键不存在就会引发异常。请优先使用 request.form.get('x'),它会改为返回 None。
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
user = request.form.get('username')
if not user:
return 'Missing username', 400
return 'Welcome ' + user
print('.get avoids KeyError')在一个视图中处理 GET 和 POST
一种常见模式是:在 GET 请求中显示表单,在 POST 请求中处理数据,并将两者放在同一个视图中。
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/contact', methods=['GET', 'POST'])
def contact():
if request.method == 'POST':
return 'Thanks, ' + request.form.get('name', 'friend')
return render_template('contact.html')
print('One view, two methods')验证输入
绝不要信任用户输入。在使用数据之前,请检查必填字段是否存在,以及字段值是否合理。
from flask import Flask, request
app = Flask(__name__)
@app.route('/age', methods=['POST'])
def age():
raw = request.form.get('age', '')
if not raw.isdigit():
return 'Age must be a number', 400
return 'Age is ' + raw
print('Validate before trusting input')读取 JSON
API 客户端经常发送 JSON。request.get_json() 会将正文解析为 Python 字典。
from flask import Flask, request
app = Flask(__name__)
@app.route('/api', methods=['POST'])
def api():
data = request.get_json()
return 'Got name ' + data.get('name', '?')
print('get_json parses the JSON body')文件上传
上传的文件位于 request.files 中。验证文件后,可以使用其 .save() 方法保存文件。
from flask import Flask, request
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload():
f = request.files.get('photo')
if f:
return 'Received ' + f.filename
return 'No file', 400
print('request.files holds uploads')POST 后重定向
处理表单后,请将用户重定向,以避免用户刷新页面时重复提交。请使用 redirect(url_for(...))。
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/done')
def done():
return 'All done'
@app.route('/save', methods=['POST'])
def save():
return redirect(url_for('done'))
print('Post/Redirect/Get pattern')闪现消息
flash() 会存储一条重定向后显示的一次性消息,非常适合显示“保存成功”等确认信息。
from flask import Flask, flash, redirect, url_for
app = Flask(__name__)
app.secret_key = 'change-me'
@app.route('/save', methods=['POST'])
def save():
flash('Saved successfully')
return redirect(url_for('save'))
print('flash shows a one-time message')快速检查
测试您处理表单的知识。
回顾
您学会了在 Flask 中处理用户输入。
- 使用
request.args处理查询字符串,使用request.form处理表单字段 - 使用
request.get_json()处理 JSON 正文,使用request.files处理上传文件 - 始终验证输入,并使用
.get()进行安全访问 - 使用提交/重定向/获取模式和
flash()改善用户体验
常见问题解答
「表单与请求数据」课时是免费的吗?
是的 — 「表单与请求数据」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「表单与请求数据」这节课中我会学到什么?
处理用户输入 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「表单与请求数据」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。