Fdfs_client包下的坑!

关于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部署,不用调整代码

希望这版记录能帮助大家,有近路不走弯路!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芦苇浮绿水

觉得还不错请博主喝杯饮料

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值