关于python3.6与python3.7下的fdfs_client包
因为近期的项目一直和图片打交道,为了效率更高更节省内存需要把img和MV一类的文件存到云端上的Fastdfs上面,结果问题就来了:因为我是在windows上面编写的代码,编写好之后才部署在服务器上,结果当我把项目部署上之后存图片就一直报错
错误如下:
TypeError: type object argument after ** must be a mapping, not tuple
**what?本来在windows下面好好的代码为什么到linux上面就不行了呢,还说我必须要返回字符串的类型,不是元祖?… **
很无奈,去网上查吧… ,搜了一圈网上也没有找到答案,我开始怀疑是不是python的版本不对
**我把linux上的python3.6换成了python3.7,Django的版本换成2.0.3,完全和windows上面的一致 **
不曾想…呵呵呵呵,完美报错
ModuleNotFoundError: No module named 'fdfs_client'
**这又是什么鬼,明明有这个包,为什么说没有,重新下载 下载完成之后启动服务 **
开始存图片,好漫长的等待(30K的图片仿佛存了一个世纪)
Internal Server Error: /admin/G_map/housing_img/add/
File "/usr/local/python3/lib/python3.7/site-packages/fdfs_client/fdfs_client/connection.py", line 196, in tcp_send_data
conn._sock.sendall(bytes_stream)
socket.timeout: timed out
又完美报错,说我连接超时 我就怀疑我是不是下载错包了 卸载 重新下 这次下载个2.0.0的client包
error:
if __name__ == '__main__':
print get_file_ext_name('/bc.tar.gz')
^
又尼玛报错?明明是pip3下载的包为什么print不带括号?
自己思路又一次被终结了,于是我想是不是windows下的包与linux下的包不一样啊,于是查看
自己的想法是对了,win的包和linux的包虽然版本一样,但是大有不同,之所以会报错就是里面的代码有太多的不一样
卸载,下载3.6版本的包 py3Fdfs
存储图片,ok,报错!
TypeError: type object argument after ** must be a mapping, not tuple
原汁原味啊!!!!!!!!!!!!!!!!!!
于是操蛋的又回到了最初的起点,后来查到了CSDN上有人上传的fdfs_client包,花了两积分下载了
那也就是恶心,30K的图片能上传了,上传2M的直接time out 已经有点烦躁了。。。
慢慢看看底层吧,看看有什么不一样,结果发现了,win下边返回的是字符串,而linux返回的却是元祖
自从python3之后,linux上用的都是py3FDfs包,很好!又重新下载了
改写代码:
#windows版
from fdfs_client.client import Fdfs_client
class FastDFSStorage(Storage): #重写底层storage
def _save(self, name, content):
"""
保存文件
:param name: 传入文件名
:param content: 文件内容
:return:保存到数据库中的FastDFSDE文件名
"""
#链接对象
client = Fdfs_client(self.client_conf)
#上传文件通过文件内容
ret = client.upload_by_buffer(content.read())
if ret.get("Status") != "Upload successed.":
raise Exception("upload file failed")
file_name = ret.get("Remote file_id")
return file_name
改为:
#linux版
from fdfs_client.client import *
class FastDFSStorage(Storage): #重写底层storage
def _save(self, name, content):
"""
保存文件
:param name: 传入文件名
:param content: 文件内容
:return:保存到数据库中的FastDFSDE文件名
"""
#链接对象
client_conf_obj = get_tracker_conf(self.client_conf)
client = Fdfs_client(client_conf_obj)
#上传文件通过文件内容
ret = client.upload_by_buffer(content.read())
if ret.get("Status") != "Upload successed.":
raise Exception("upload file failed")
file_name = ret.get("Remote file_id")
return file_name
运行服务 存储图片 ok 报错 !
TypeError: __str__ returned non-string (type bytes)
说是返回的不是str是bytes类型,这么说要解码喽
#返回值解码
return file_name.decode()
怀着激动的心情点击上传图片,祈求春哥保佑
当当当当!ok!成功!
(HTTP/1.1 200) #就冲这200,我就知道成功了
总结:linux上部署python3的项目,只要是用到fdfs_client包,最好直接pip3 install py3Fdfs
如果安装有其他fdfs_client包, 要先卸载干净了再安装py3Fdfs
注意:在windows下是不能直接安装fdfs_client的,会报错!可以手动下载fdfs_client_master包,或者直接pip install py3Fdfs 这样可以直接在linux部署,不用调整代码
希望这版记录能帮助大家,有近路不走弯路!