请求与响应 - 处理请求数据
request 对象
当浏览器去访问一个地址时,HTTP 协议会向后台传递一个 request 对象。这个 request 对象包含请求头、请求参数、以及请求方式。后台可以取到 request,然后进行逻辑处理。
在 Flask 中,可以使用 request 对象来处理请求数据。request 对象提供了访问请求数据的方法和属性。
request 的常用属性/方法
以下是一些常见的处理请求数据的方法:
属性/方法 | 说明 |
args | 记录请求中的查询参数 |
json | 记录请求中的 json 数据 |
files | 记录请求上传的文件 |
form | 记录请求中的表单数据 |
method | 记录请求使用的 HTTP 方法 |
url | 记录请求的 URL 地址 |
host | 记录请求的域名 |
headers | 记录请求的头信息 |
普通请求参数处理
如果一个 GET 请求在 URL 中拼接了请求参数,可以使用 request.args
来获取 GET 请求中携带的请求参数。request.args
是一个字典,可以通过键名来获取参数的值。
from flask import Flask, request
# 创建 Flask 应用程序实例
app = Flask(__name__)
@app.route('/user')
def get_user():
# 获取 URL 中的请求参数
url_param = request.args
# 查看获取到的请求参数的类型
print(type(url_param))
# 获取请求参数中的 username 对应的值
username = url_param.get('username')
return f'Hello, {username}!'
# 运行应用程序
if __name__ == '__main__':
app.run()
访问 /user?username=John
,将返回 'Hello, John!'
。
查看服务端日志信息,可以看到 request.args
取到的值的数据类型为 werkzeug.datastructures.structures.ImmutableMultiDict,也是一个可迭代的对象,访问方法和基础的字典类似。想要获取这个字典中 username
对应的值,可以直接使用 get()
方法。
JSON 请求体处理
如果是 POST 或者 PUT 相关的请求,需要带有 JSON 数据格式,可以使用 request.json
来获取 POST 请求中的 JSON 数据。request.json
会解析请求的 JSON 数据,并返回一个包含解析后的数据的字典,然后可以根据需要获取特定的字段值。
from flask import Flask, request
# 创建 Flask 应用程序实例
app = Flask(__name__)
@app.route('/data', methods=['POST'])
def process_data():
# 获取 JSON 格式请求体
data = request.json
# 查看获取到的请求参数的类型
print(type(data))
# 获取请求体中对应字段的值
name = data.get('name')
age = data.get('age')
return f'Name: {name}, Age: {age}'
# 运行应用程序
if __name__ == '__main__':
app.run()
提交 JSON 格式请求体,请求体中包含姓名和年龄,将返回姓名和年龄的信息。
表单请求体处理
如果是 POST 相关的请求,需要带有 form 表单格式数据格式,可以使用 request.form
来获取 POST 请求中的表单数据。request.form
是一个字典,可以通过键名来获取表单字段的值。
from flask import Flask, request
# 创建 Flask 应用程序实例
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login():
# 获取表单格式请求体
user_info = request.form
# 查看获取到的请求参数的类型
print(type(user_info))
# 获取请求体中对应字段的值
username = user_info.get('username')
password = user_info.get('password')
return f'Welcome, {username}!'
# 运行应用程序
if __name__ == '__main__':
app.run()
通过提交包含用户名和密码的表单,将返回欢迎信息。
文件请求体处理
如果页面上需要提交一个图片,或者上传一个文件到后端服务器,可以使用 request.files
来获取请求中包含的文件。request.files
是一个字典,每个上传的文件都会存储在这个字典里。可以通过 file
这个 key 来获取其中的文件对象。
已上传的文件存储在内存或是文件系统中一个临时的位置。它有一个 save()
方法,这个方法允许把文件保存到服务器的文件系统上。
如果想知道上传前文件在客户端的文件名是什么,可以访问 filename
属性。但这个值是可以伪造的。如果要把文件按客户端提供的文件名存储在服务器上,需要把它传递给 Werkzeug 提供的 secure_filename()
函数。这个函数可以用来确保文件名是安全的。
通过提交包含用户名和密码的表单,将返回欢迎信息。
文件请求体处理
如果页面上需要提交一个图片,或者上传一个文件到后端服务器,可以使用 request.files
来获取请求中包含的文件。request.files
是一个字典,每个上传的文件都会存储在这个字典里。可以通过 file
这个 key 来获取其中的文件对象。
已上传的文件存储在内存或是文件系统中一个临时的位置。它有一个 save()
方法,这个方法允许把文件保存到服务器的文件系统上。
如果想知道上传前文件在客户端的文件名是什么,可以访问 filename
属性。但这个值是可以伪造的。如果要把文件按客户端提供的文件名存储在服务器上,需要把它传递给 Werkzeug 提供的 secure_filename()
函数。这个函数可以用来确保文件名是安全的。
from flask import request
from werkzeug import secure_filename
# 创建 Flask 应用程序实例
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload_file():
# 获取文件格式请求体
file = request.files
# 查看获取到的请求参数的类型
print(type(file))
# 获取请求体中对应字段的值
f = file.get("file")
# 保存文件
# 需要提前创建 uploads 目录,secure_filename 可以确保文件名安全
f.save('./uploads/' + secure_filename(f.filename))
return f'File {f.filename} is saved!'
# 运行应用程序
if __name__ == '__main__':
app.run()
通过提交包含文件的请求体,将返回文件保存息。
其他请求参数处理
如果在进行业务处理的时候,需要根据不同的请求 URL、域名、请求参数或者请求头信息进行不同场景的判断,则可以使用以下方法获取对应的值。
from flask import request
from werkzeug import secure_filename
# 创建 Flask 应用程序实例
app = Flask(__name__)
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
# 获取请求 URL
r_url = request.url
# 获取请求域名
r_host = request.host
# 获取请求头信息
r_headers = request.headers
# 获取请求方法
r_method = request.method
print(r_url, r_host, r_headers, r_method)
# 获取文件请求体
r_file = request.files
# 判断请求方法为 POST
if r_method == 'POST':
# 判断请求头中包含 My-Header 字段并且值为 hogwarts
if r_headers.get('My-Header') == "hogwarts":
# 保存文件
f = r_file.get("file")
f.save('./uploads/' + secure_filename(f.filename))
return f'File {f.filename} is saved! URL is {r_url}, host is {r_host}'
return f"My-Header is missing!"
return f"Method is wrong!"
# 运行应用程序
if __name__ == '__main__':
app.run()