04.请求与响应 处理请求数据

发布时间 2023-11-19 00:29:56作者: 想要暴富的小男孩

请求与响应 - 处理请求数据

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()