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的知识我就分享到这里了,以后有机会再和大家扩展吧!!!