写点什么

Flask 请求与响应 - 视图函数处理请求数据

作者:测试人
  • 2024-01-19
    北京
  • 本文字数:3121 字

    阅读完需:约 10 分钟

霍格沃兹的测试管理班是专门面向测试与质量管理人员的一门课程,通过提升从业人员的团队管理、项目管理、绩效管理、沟通管理等方面的能力,使测试管理人员可以更好的带领团队、项目以及公司获得更快的成长。提供 1v1 私教指导,BAT 级别的测试管理大咖量身打造职业规划。

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 Flaskfrom 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!"
复制代码

这样就可以校验请求方法、请求头信息,然后再完成对应的业务逻辑处理了。


发布于: 刚刚阅读数: 4
用户头像

测试人

关注

专注于软件测试开发 2022-08-29 加入

霍格沃兹测试开发学社,测试人社区:https://ceshiren.com/t/topic/22284

评论

发布
暂无评论
Flask请求与响应-视图函数处理请求数据_软件测试_测试人_InfoQ写作社区