Flask - 请求对象
Flask – 请求对象 (Request Object)
Section titled “Flask – 请求对象 (Request Object)”当客户端(例如 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 对象的重要属性:
Section titled “request 对象的重要属性:”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)理解 ImmutableMultiDict:
Section titled “理解 ImmutableMultiDict:”request.form 和 request.args 等属性是 ImmutableMultiDict 的实例。这意味着它们的行为类似字典,但可以为一个键存储多个值(例如,来自多个同名复选框)。如果你像 request.form['key'] 这样访问一个键,你会获得与该键关联的第一个值。要获取所有值,请使用 getlist('key') 方法。
request 对象是处理客户端输入和理解 Flask 应用中传入请求上下文的基础。