flask请求与响应-视图函数处理请求数据
-
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是一个字典,可以通过键名来获取参数的值。 -
请求与响应-视图函数处理GET请求方式的请求数据
#导入Flask,request模块
from flask import Flask,request
#创建Flask应用程序实例
app = Flask(__name__)
@app.route('/user')
def get_user():
#获取URL中的请求参数(request.args)
url_param = request.args
print(url_param)
#查看获取到的请求参数类型
print(type(url_param))
#获取请求参数中的 username 对应的值
username = url_param.get('username')
return f'Hello, {username}!'
# 运行应用程序
if __name__ == '__main__':
app.run()
request.args 返回的值的数据类型为 <class ‘werkzeug.datastructures.structures.ImmutableMultiDict’>,也是一个可迭代的对象,访问方法和基础的字典类似。想要获取这个字典中 username 对应的值,可以直接使用 .get (‘键’) 方法。
/user?username=john: 路由后手动传参username;
url_param = request.args 的打印结果是 ImmutableMultiDict([(‘username’, ‘john’)]), (‘username’, ‘john’)是一个键值对,通过.get (‘键’)方法,可获取到对应的值。
视图函数处理请求数据后的最终返回结果为:
- 请求与响应-视图函数处理POST/PUT请求方式的JSON请求体数据
如果是POST或者PUT相关的请求,需要带有JSON数据格式的请求体,可以使用request.json来获取POST/PUT请求中的json数据,request.json会将json数据解析成一个包含数据的字典,然后可以通过.get (‘键’)方法,获取对应的值。
#导入Flask,request模块
from flask import Flask,request
#创建Flask应用程序实例
app = Flask(__name__)
#创建接口路由和接口路由的请求方法
@app.route('/user',methods = 'POST')
#创建视图函数
def post_user():
#获取post请求方法中的json数据,并解析成字典格式
dict_data = request.json
#打印解析后的数据类型
print(dict_data)
#获取指定键username和pwd对应的值
username = dict_data.get('username')
pwd = dict_data.get('pwd')
#视图函数处理完数据后的返回结果
return f'username:{username},pwd:{pwd}'
打印request.json解析后的数据类型为字典类型:
视图函数处理完post请求json数据后的最终返回结果:
接口路由使用put请求方法,配合视图函数更新密码:
#导入Flask,request模块
from flask import Flask,request
#创建Flask应用程序实例
app = Flask(__name__)
@app.route('/user/put',methods=["PUT"])
#创建视图函数
def put_user():
dict_data = request.json
# 打印解析后的数据类型
print(dict_data)
# 获取指定键username和pwd对应的值
username = dict_data.get('username')
pwd = dict_data.get('pwd')
# 视图函数处理完数据后的返回结果
return f'username:{username},pwd:{pwd}'
# 运行应用程序
if __name__ == '__main__':
app.run()
视图函数处理完put请求json数据后的最终返回结果:
- 请求与响应-视图函数处理POST/PUT请求方式的表单请求体数据
如果使用POST请求方法,POST传参的参数类型为form表单,可以使用request.form来获取POST请求中的form表单数据,request.form的返回值也是一个字典类型,可以通过键名来获取表单字段的值
#导入Flask模块
from flask import Flask
#创建Flask应用程序实例
app = Flask(__name__)
#定义接口路由和视图函数
@app.route('/user',methods=['POST'])
def post_form_user():
#解析表单数据
form_data = request.form
#打印request.form的返回值类型
print(form_data)
#获取form表单中指定字段的值
username = form_data.get('username')
pwd = form_data.get('pwd')
#返回视图函数处理完请求数据后最终的结果
return f"welcome {username},{pwd}!"
视图函数处理完post请求表单数据后的最终返回结果:
- 请求与响应-视图函数处理post请求方式的文件请求体数据
如果想通过POST请求方法,给后台服务器上传一个文件,或者一张图片,可以使用request.files来获取POST请求中传参的文件或图片,request.file的返回值仍然是一个字典类型,可以通过键名来获取指定的文件对象
另外,已从客户端上传的文件会被保存在后台服务器的内存或者文件系统中的一个临时位置,可以通过save(‘存放文件的相对路径’+secure_filename(文件对象))方法实现,其中secure_filename()函数是用来确保客户端上传的文件名是安全的,必须加上。
#导入flask模块
from flask import Flask
#创建Flask应用程序实例
app = Flask(__name__)
#定义接口路由和视图函数
@app.route('/user/upload_files',methods=['POST'])
def post_upload_files():
#解析上传的文件对象数据
files_data = request.files
#通过指定的键,获取客户端上传文件中的指定文件对象
file = files_data.get('file')
#通过save()方法,将指定文件对象以安全的文件名称保存在后台服务器的指定路径下,并带上secure_filename()函数
file.save('./uploads/'+secure_filename(file.filename))
#返回视图函数处理完请求数据后最终的结果
return f"File {file.filename} has been saved!"
- 其他请求参数处理
如果在进行业务处理的时候,需要根据不同的请求URL、域名、请求参数或者请求头信息进行不同场景的判断,则可以使用以下方法获取对应的值
#导入Flask模块和相关函数模块
from flask import Flask
from werkzeug import secure_filename
#创建Flask应用程序实例
app = Flask(__name__)
#定义接口路由和视图函数
@app.route('/user/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':
#判断请求头中包含Mys-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!"
这样就可以校验请求方法、请求头信息,然后再完成对应的业务逻辑处理了。