Django项目使用FastDFS作为静态文件的存储,FastDFS与python交互,详细步骤

FastDFS在上一篇文章中,我们已经在虚拟机里面配置好了,并且搭配了nginx提高文件提供的效率

FastDFS能够解决海量的文件存储,并且它的检索内容指纹,发现相同文件就不再进行新的储存的机制对于相同文件重复储存,浪费空间资源的问题有很好的解决。
FastDFS已经搭建好了,那么我们怎么在我们python的django项目中使用呢?
博主在自己的博客中就使用了FastDFS,现在就通过实例还给大家分享一下怎么取与python交互!!!
做之前,先给大家理一下思路
在这里插入图片描述
步骤开始:

1,安装fdfs_client包
理论上来说,通过

pip install fdfs_client

就可以安装,但是实际结果是,报错,因此我们采取第二种解决方案
下载fdfs_client-py-master安装包,至于去哪里下载?我这就有,你还可以去网上搜搜,应该都可以找到

下载好后,解压并打开fdfs_client文件
在这里插入图片描述
修改storage_client.py文件
在这里插入图片描述
修改第12行这个导入,否则会报错
在这里插入图片描述
修改完后,把这个fdfs_client包放入到你的虚拟环境的lib目录下
在这里插入图片描述
然后就可以在python中导入了,现在先不着急,我们先把我们之前在虚拟机配置好了的client.conf文件copy到我们的python项目中,放到哪里呢?看图
在这里插入图片描述
在和主项目同级的utils文件下,创建了一个fdfs包,然后把client.conf放到这里,
至于为什么放这里,当然是方便管理
现在fdfs_client也有了,client.conf也有了,从我的图中可以看出,还需要重写一下django默认的文件储存类,那个方法好像是叫FileStorage还是啥来着,忘了,但是源码可不能改,于是我们自己新写一个,那个类继承的是Storage这个父类,因此我们重写的保存文件的类,也继承Storage,
storage.py里面的代码如下:

from fdfs_client.client import Fdfs_client 

from django.conf import settings
from django.core.files.storage import Storage


class FDFSStorage(Storage):
    def __init__(self,client_conf_path=None,url_ip=None):
        if client_conf_path is None:  
            client_conf_path = settings.CLIENT_CONF_PATH  #这是client.conf的地址路径
        self.client_conf_path = client_conf_path
        if url_ip is None:  #这是ip+端口号的字符串
            url_ip = settings.URL_IP
        self.url_ip = url_ip

    def open(self, name, mode='rb'):  #重写下文件打开的方法,不用修改任何东西,直接pass
        pass
    def save(self, name, content, max_length=None): #重写save方法,文件存储业务逻辑所在,重点
        client = Fdfs_client(self.client_conf_path)  #创建Fdfs_client的文件保存对象
        rest = client.upload_appender_by_buffer(content.read())  #通过检索文件内容,然后根据文件内容生成文件地址等信息,rest的格式是一个字典
        if rest.get('Status') != 'Upload successed.':  #从rest字典中取出状态,显示Upload successed.则为上传成功,否则抛出异常,那个点不是打错了,就是有点
            raise Exception('文件上传失败')
        filename = rest.get('Remote file_id')  #获取文件指纹
        return filename  #返回文件指纹,也就是保存到我们数据库表里面的内容

    def exists(self, name):  #重写exists内容,因为每次保存文件时django都会调用这个方法判断文件名是否存在,不存在就可以保存,于是乎,我们直接返回False
        return False

    def url(self, name):  #还记得我们前端的{{ obj.img.url }} 这个模板语言吗,url调用的就是这个url方法,name就是我们存数据库的图片地址,也就是我们上面save返回的filename,这里返回url的时候我们做一下加工,形成完整的静态资源路径
        return self.url_ip+name

重写完文件保存的类之后,我们去settings配置一下我们自己写的变量,顺便把默认图片处理类改我们自己写的类:
在这里插入图片描述

#设置默认图片上传处理类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'

CLIENT_CONF_PATH = './utils/fdfs/client.conf'
URL_IP = 'http://10.10.21.189:8888/'

来吧,插入一条数据实验一下,打开xadmin
在这里插入图片描述
我在xadmin上插入了一条数据,地址成功显示为我们fdfs生成的文件指纹
然后写一个实验的视图:

def cktest(request):
    goods = Goods.objects.get(id=5)
    return render(request,'cktest.html',{'goods':goods})

url我就不贴了,贴下前端代码:

<img src="{{ goods.goods_image.url }}" alt="">

然后看一下效果:
在这里插入图片描述
成功保存到fdfs上面,并且在浏览器成功获取,完美

其实{{ goods.goods_image.url }}的地址就是
http://10.10.21.189:8888/group1/M01/00/00/CgoVvV1pRYSESZ9DAAAAABecBG46253392
等这种地址
然而你直接访问就是下载,不会显示图片,我试过了,看下图
在这里插入图片描述

所以,通过django模板渲染然后浏览器对fdfs的nginx进行请求就能显示图片了
完美,关于FastDFS的知识我就分享到这里了,以后有机会再和大家扩展吧!!!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值