Flask 请求处理详解:表单、文件与 Cookie 操作指南

Miles
Miles
发布时间:2026-10-13 | 5人浏览过
原创

本文深入解析 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,此时可利用延迟请求回调模式实现该功能。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表