作为一个学习python 的菜鸟,一直以为在使用第三方库的过程中都是简单的引用,都经过大家一次次的历练过,况且我又是个新人使用的都是基本简单的函数或者方法,怎么会遇到错误呢(指的是第三方库,甚至python本身的问题),出了错误只会一味一直在查看自己哪里不对,反复确认实验,修改,以前都是这样,每次也都奏效,一点一滴的把自己犯下的错误改正过来,让代码正确无误的跑起来(在我自己有限的使用范围内),直到今天,一个在使用python requests 库时,通过post上传名称为中文文件时我遇到的问题,我一直在查询是自己那里出错了,还在不断排除是不是设置的post 实体中filename 的编解码有问题,毕竟使用英文名称的文件就可以正常上传,但是一换到名称是中文的就会出错,整整困扰了我一天的时间,如果不是搜索到别人曾经和我遇到相同类型的问题,看了他下边的答案,现在还不会怀疑是引用requests 第三方库自己出了问题,所以有时在自己已经确认写的代码没有问题时,换个角度,想一想是不是引用本身的问题?但是话又说回来,像我这样的菜鸟那里有自信去怀疑“权威”,所以还是一点一滴的积累经验吧,这样才能有实力去质疑“权威”
我具体遇到的问题如下:
files = {"image_request[locale]":(None,"zh-CN"),
"image_request[language]":(None,"zh-CN"),
"image_request[image]":(image_name,open(self.url,"rb"),"image/"+content_type )
}
token_req = requests.post(api_url,files=files,headers=headers)
通过抓包对比我的代码post 中文名称file (每次都失败)与浏览器post中文名称file (每次都成功)时,发现在在实体中filename一项会有不同,所以就搜索这个关于filename的关键词,结果发现了说是可能requests库本身的问题,具体解决如下:
Inside site-packages/requests/packages/urllib3/fields.py, delete this (line ~50):
value = email.utils.encode_rfc2231(value, 'utf-8')
And change the line right underneath it to this:
value = '%s="%s"' % (name, value.decode('utf-8'))
This makes servers (that I've tested) pick up the field and process it correctly.
https://github.com/kennethreitz/requests/issues/2117 ~issues!
这是我搜索到的解决方案,可是照着这个去修改第三方库还是不行,又结合抓包,发现filename 这一项,又多了一个filename字段,即:filename*=filename=“中文名称”.JPG 看到这里我又试着在上文提到的第三方库中的具体位置又修改了一下
把value = '%s*=%s' % (name, value) 这一行代码去掉,bingo,结果我的代码可以跑通了,这个问题也就迎刃而解了!
通过这我又学习到了一种解决问题的方法或者经验。