Flask 请求处理详解:表单、文件与 Cookie 操作指南
本文深入解析 Flask 框架中的请求处理机制,涵盖如何获取表单数据、URL 参数及上传文件。重点讲解 request 对象的 form、args 和 files 属性用法,以及处理文件上传时的安全注意事项。同时介绍 Cookie 的读取与设置方法,区分直接操作 Cookie 与使用 Session 的区别,并提供完整的代码示例与最佳实践建议。
本节介绍 Flask 中的请求处理机制。若需在无实际 HTTP 请求的环境下获取上下文,可调用 test_request_context() 或 request_context() 方法。通过 request 对象,开发者可以分别利用 form 属性获取表单提交的数据,通过 args 属性提取 URL 中的查询参数,使用 files 属性处理文件上传,并利用 cookies 属性进行 Cookie 的相关操作。
首先,需从 flask 模块中导入 request 对象:
from flask import request
当前请求的 HTTP 方法可通过 method 属性访问。若需获取通过 POST 或 PUT 方法传输的表单数据,应使用 form 属性。以下是结合上述两个属性的完整示例,请据此修改 hello.py 文件:
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
# 当请求形式为“GET”或者认证失败则执行以下代码
return render_template('login.html', error=error)
若 form 属性中不存在指定的键值,将触发 KeyError 异常。该异常可像标准 KeyError 一样被捕获处理;若不进行捕获,Flask 将返回 HTTP 400 Bad Request 错误页面。在多数情况下,无需对此进行特殊处理。
可通过 args 属性接收通过 URL(格式为 ?key=value)提交的参数:
searchword = request.args.get('key', '')
建议优先使用 get 方法访问 URL 参数或捕获 KeyError。由于用户可能手动修改 URL,直接显示 400 Bad Request 页面体验不佳,因此推荐更友好的错误处理方式。
Flask 提供了便捷的文件上传处理功能。需确保 HTML 表单中设置了 enctype="multipart/form-data" 属性,否则浏览器不会发送文件数据。
上传的文件暂存于内存或文件系统的临时位置。可通过请求对象的 files 属性访问这些文件,该属性是一个字典,每个上传的文件作为字典值存储。文件对象表现为标准的 Python file 对象,并额外提供 save() 方法,用于将文件保存至服务器文件系统。
以下示例演示如何将文件提交至服务器:
from flask import request
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/uploaded_file.txt')
...
若需获取客户端上传文件的原始文件名,可访问 filename 属性。但需注意,该值可能被伪造,因此不可直接信任。若需使用客户端文件名在服务器上存储文件,应将其传入 Werkzeug 提供的 secure_filename() 函数进行安全处理:
from flask import request
from werkzeug import secure_filename
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/' + secure_filename(f.filename))
...
3.1.4 Cookies
可通过 cookies 属性访问客户端发送的 Cookie。使用响应对象的 set_cookie 方法可设置 Cookie。请求对象中的 cookies 属性是一个包含所有客户端发送 Cookie 的字典。
若需使用会话(sessions),请勿直接操作 Cookie,而应使用 Flask 提供的会话机制。Flask 在 Cookie 基础上增加了安全细节;关于 Session 与 Cookie 的区别与联系,可参考施杨的博客文章。
读取 Cookie 示例:
from flask import request
@app.route('/')
def index():
username = request.cookies.get('username')
# 注意这里引用cookies字典的键值对是使用cookies.get(key)
# 而不是cookies[key],这是防止该字典不存在时报错"keyerror"
存储 Cookie 示例:
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
注意,Cookie 是在响应对象中设置的。通常视图函数仅返回字符串,Flask 会自动将其转换为响应对象。若需显式操作,可使用 make_response() 函数创建响应对象后再进行修改。
有时需在无响应对象的上下文中设置 Cookie,此时可利用延迟请求回调模式实现该功能。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









