课程章节:走进数据分析
课程讲师: Mushishi
课程内容:3-5 request上传文件操作
1. 上传文件-比如上传图片:
【步骤】:
上传时所需用到files参数
files={
"filename":("文件名称",open("文案路径","rb"))
}
-----选择文件名称, 读文件open()(文件路径,怎么去读"rb类型"),文件是什么格式的。
上传文件接口:POST: /web/file/upload_oss
传参为:Content-Disposition: form-data; name="file"; filename="司机小程序二维码.png"
Content-Type: image/png
------上传文件接口与普通接口的不同:
普通接口Content-type为json格式(Content-Type: application/json; charset=UTF-8)
上传文件接口Content-type为form-data格式(Content-Type: multipart/form-data;)
注: content-type常用格式:(Content-Type定义了请求体的编码格式)
text/plain :纯文本格式
application/json: JSON数据格式
application/xml: 以xml格式上传数据
application/x-www-form-urlencoded 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
multipart/form-data : 表单形式上传数据,常用于上传图片、上传文件、附件等控件的表单;
使用requests库发送form-data格式的http请求:
form-data格式一般是用来进行文件上传的。但后台写的登录接口必须让入参以form-data格式传入;
【名词解释】
关于boundary:
普通post请求使用 & 来分隔参数,那服务器使用multipart/form-data格式接收POST请求时,使用何种方式来分割参数的呢?答案是boundary。
boundary 用于分割参数(使用两个短横线”–”加上boundary字符串作为不同参数的分割),类似于普通post请求中的 &
Content-Type: image/png 格式为图片格式
Content-Disposition: 存放所传参数的具体信息
2. 需要注意part头信息中的Content-Disposition头,比如Content-Disposition: form-data; name="file"; filename="司机小程序二维码.png"是必须的。和前端标签和后台接口之间传参相关联;
前端标签:<input type="file" name="file" accept=".jpg,.jpeg,.png" class="el-upload__input">
requests针对form-data格式的具体处理:
requests模拟的表单格式如下:files = {${name--字段名}: (<filename--文件名称>, <file object--字段值,传参,读取文件>,<content type--文件类型>, <per-part headers>)}
这一行模拟出来的post传参数据为:
Content-Disposition: form-data; name={name};filename=<filename>
Content-Type: <content type>
<file object>
--boundary
通过上述说明,我们可以构造出files后直接post请求发送即可:
files = {
'name': ('filename', 'file objec', 'contect-type')
}
response = requests.post(url, files=files)
#verify=False,不验证ssl证书;(一般https请求中使用)
代码报错:加了verify=False后代码报异常: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.imooc.com'. Adding certificate verification is strongly advised.
原因:requests默认附带了一套https信任的证书,不加verify时,默认为True,开启SSL验证。每次调用接口,都会下载证书,验证证书。此时不会报错;但是requests默认附带的根证书在每次requests更新时才会更新,如果固定使用某一版本的requets,那么证书就有可能太旧了。
如果证书版本低会导致证书验证抛出SSLError。
如果不进行证书验证,设置verify=False,则会抛出InsecureRequestWarning异常,具体不验证证书,但是又不会报错的方法------>详细解释可见http://www.python66.com/pythonpachong/402.html
**************注: 读文件类型的时候,写法一般是怎样的呢?
-----选择文件名称, 读文件open()(文件路径,怎么去读"rb类型")
-----"filename":("文件名称",open("文案路径","rb"))
#rb模式:以字节(二进制)方式读取文件中的数据。
读取非文本文件,比如: 视频,图片,音频等文件需要使用rb模式读取数据
#wb模式: 以字节(二进制)方式往文件中写入数据
#ab模式: 以字节(二进制)方式往文件末尾追加写入数据
课程收获:
收获满满,老师讲的挺喜欢,最后实践到了自己的项目中。把学习和工作想融合;