django自定义存储换为分布式FastDFS

为什么要用fastdfs

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务

 

服务端两个角色:

Tracker:管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。 

Storage:实际保存文件 Storage 分为多个组,每个组之间保存的文件是不同的。每 个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有 主从的概念。

 

FastDFS架构

 

服务端配合nginx百度上一大堆

nginx配置  

./configure --prefix=/usr/local/nginx/ --add-module=fastdfs-nginx-module-master解压后的目录的绝对路径/src

server {

            listen       8888;

            server_name  localhost;

            location ~/group[0-9]/ {

                ngx_fastdfs_module;

            }

            error_page   500 502 503 504  /50x.html;

            location = /50x.html {

            root   html;

            }

        }

 

客户端安装

 

进入fdfs_client-py-master.zip所在目录

pip install fdfs_client-py-master.zip

pip install安装request和mutagen

记住client.conf的绝对路径

测试

>>> from fdfs_client.client import Fdfs_client

>>> client = Fdfs_client('client.conf的绝对路径')

>>> ret = client.upload_by_filename('你要上传的文件')

>>> ret

{'Group name':'group1','Status':'Upload successed.', 'Remote file_id':'group1/M00/00/00/

wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploaded size':'6.0KB','Local file name':'test'

, 'Storage IP':'192.168.243.133'}

django配置fastdfs

新建py文件 可直接cp拿去用 然后改配置文件settings

#设置fdfs使用的client.conf
FDFS_CLIENT_CONF='/etc/fdfs/client.conf'   #client.conf的绝对路径
#是指fdfs的nginx的url
FDFS_URL='http://192.168.4.3:8888/'   #你的nginx端口url

下面代码直接cp就可以用

---------------------------------------------------------------------------------------------------------

from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings

class FDFSSorge(Storage):
    """文件存储类"""
    #设置初始化方法,利用django配置文件将方法写活
    def __init__(self,client_config=None,base_url=None):
        if client_config is None:
            client_config=settings.FDFS_CLIENT_CONF
        self.client_config=client_config
        if base_url is None:
            base_url=settings.FDFS_URL
        self.base_url=base_url

    def _open(self,name,mode='rb'):
        """打开文件"""
        pass

    def _save(self,name,content):
        """保存文件"""
        #name:上传文件名字
        #content:包含文件上传
        client=Fdfs_client(self.client_config)
        #上传文件返回一个字典
        # dict
        # {
        #     'Group name': group_name,
        #     'Remote file_id': remote_file_id,
        #     'Status': 'Upload successed.',
        #     'Local file name': '',
        #     'Uploaded size': upload_size,
        #     'Storage IP': storage_ip
        # }
        res=client.upload_by_buffer(content.read())

        if res.get('Status') != 'Upload successed.':
            raise Exception('上传文件失败')

        file_id=res.get('Remote file_id')

        return file_id


    def exists(self, name):
        return False

    def url(self, name):
        """返回访问文件url访问路径"""
        return self.base_url+name


------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_36811322/article/details/89364297
今日推荐