今天用django做一个下载功能,遇到的一个报错,这里记录一下解决过程以及解决方法。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 12-21: ordinal not in range(128)
错误代码:
def DownTxt(self,request,queryset): for i in queryset: title=i.title+'.txt' newurl=r'http://127.0.0.1:8000/static/'+title filepath=r'E:\\txt55\\' if not os.path.exists(filepath): print("Selected folder not exist, try to create it.") os.makedirs(filepath) content=i.content with open('static/'+title,'w',encoding='utf-8') as fo: fo.write(content) urllib.request.urlretrieve(newurl, filename=filepath+title) messages.success(request,'下载完成了!')
出现这个错误的原因是urllib.request.urlretrieve(url,filename)无法处理含有中文的链接。
比如:http://6yhj,com/tag/我爱学习/这样的就不行。我上面要处理的下载链接中都是含有中文的。
那么就必须将这个链接中的中文进行转换,这时候需要用到urllib.parse.quote
正确代码:
def DownTxt(self,request,queryset): for i in queryset: title=i.title+'.txt' newtitle=urllib.parse.quote(title) newurl=r'http://127.0.0.1:8000/static/'+newtitle filepath=r'E:\\txt55\\' if not os.path.exists(filepath): print("Selected folder not exist, try to create it.") os.makedirs(filepath) content=i.content with open('static/'+title,'w',encoding='utf-8') as fo: fo.write(content) urllib.request.urlretrieve(newurl, filename=filepath+title) messages.success(request,'下载完成了!')
这样子之后就解决了啦!
而且也成功下载了我想要的文件。
标签: