Skip to content

Flask - 请求对象

当客户端(例如 Web 浏览器或其他应用程序)向你的 Flask 应用发送请求时,Flask 会通过一个名为 request 的全局 上下文局部对象 (context local object) 来提供有关该请求的所有信息。要在你的视图函数 (view functions) 中使用它,你需要从 flask 模块导入它。

from flask import Flask, request
app = Flask(__name__)
@app.route('/process', methods=['GET', 'POST'])
def process_request():
# Access request data here using the 'request' object
# 在这里使用 'request' 对象访问请求数据
user_agent = request.headers.get('User-Agent')
http_method = request.method
# ... process other request attributes ...
# ... 处理其他请求属性 ...
return f"Request Method: {http_method}, User Agent: {user_agent}"
  • request.method: 用于请求的 HTTP 方法(例如,'GET'、'POST'、'PUT'、'DELETE')。这对于区分同一 URL 上的不同操作至关重要。
  • request.form: 一个类似字典的对象 (ImmutableMultiDict),包含从提交的 HTML 表单中解析出的数据(通常通过 POST 或 PUT 请求发送,Content-Type 为 application/x-www-form-urlencoded 或 multipart/form-data)。键对应于表单元素的 name 属性。
  • request.args: 一个类似字典的对象 (ImmutableMultiDict),包含从 URL 的查询字符串(? 后面的部分)中解析出的内容。常用于在 GET 请求中传递参数(例如,/search?query=flask)。
  • request.values: 一个组合了 request.form 和 request.args 数据的类似字典的对象。为了清晰起见,通常最好直接使用 form 或 args。
  • request.json: 如果请求的 MIME 类型是 application/json,则此属性包含请求正文中发送的解析后的 JSON 数据。如果 MIME 类型不同或解析失败,则返回 None。这对于构建 API 至关重要。
  • request.files: 一个类似字典的对象 (ImmutableMultiDict),包含通过 HTML 表单 (<input type="file">) 上传的任何文件的文件对象。键对应于文件输入的 name 属性。
  • request.cookies: 一个包含客户端发送的 Cookie 的字典。
  • request.headers: 一个类似字典的对象,包含请求头(例如,User-Agent、Content-Type、Accept)。可以使用 request.headers.get('Header-Name') 访问请求头。
  • request.remote_addr: 发送请求的客户端的 IP 地址。(注意:如果位于代理服务器后面,此属性可能不可靠)。
  • request.url: 客户端请求的完整 URL。
  • request.base_url: URL 中不包含查询字符串的部分。
  • request.path: URL 中不包含域名的路径部分。
  • request.script_root: 如果应用程序部署在子目录中,则此为子目录的路径。
  • request.endpoint: 当前匹配的视图函数的端点名称。
  • request.view_args: 匹配的路由规则捕获的变量参数(例如,/user/<name> 中的 name)。

示例:访问表单数据和查询参数

Section titled “示例:访问表单数据和查询参数”
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# Access form data submitted via POST
# 访问通过 POST 提交的表单数据
username = request.form.get('username') # Use .get() to avoid KeyError if missing
# 使用 .get() 方法,避免键不存在时引发 KeyError 错误
password = request.form.get('password')
# In a real app: validate credentials
# 在实际应用中:验证凭据
if username and password:
return f'Login successful for user: {username}'
else:
return 'Login failed: Missing username or password.', 400
else: # GET request
# GET 请求
# Access query parameters (e.g., /login?error=credentials)
# 访问查询参数(例如,/login?error=credentials)
error_message = request.args.get('error')
# Render the login form (assuming you have login.html template)
# 渲染登录表单(假设你有一个 login.html 模板)
return render_template('login_form.html', error=error_message)
# A simple template templates/login_form.html:
# 一个简单的模板 templates/login_form.html:
# <!DOCTYPE html>
# <html><body>
# <h1>Login</h1>
# {% if error %}<p style="color: red;">Error: {{ error }}</p>{% endif %}
# <form method="post">
# Username: <input type="text" name="username"><br>
# Password: <input type="password" name="password"><br>
# <input type="submit" value="Login">
# </form>
# </html></body>
if __name__ == '__main__':
app.run(debug=True)

request.form 和 request.args 等属性是 ImmutableMultiDict 的实例。这意味着它们的行为类似字典,但可以为一个键存储多个值(例如,来自多个同名复选框)。如果你像 request.form['key'] 这样访问一个键,你会获得与该键关联的第一个值。要获取所有值,请使用 getlist('key') 方法。

request 对象是处理客户端输入和理解 Flask 应用中传入请求上下文的基础。