Django1.8.2二次开发对接FastDFS-自定义文件存储系统

Django1.8.2二次开发对接FastDFS-自定义文件存储系统

参考:Django1.8.2 – 自定义存储
如果你需要提供自定义文件存储 – 一个普遍的例子是在某个远程系统上储存文件 – 你可以通过定义一个自定义的储存类来实现
在这里插入图片描述

项目上传图片和使用图片流程

在这里插入图片描述
使用分布式文件管理系统FastDFS可以实现:
文件海量存储,存储容量扩展方便
文件内容重复的话不用重新上传,结合nginx提高网站提供图片的效率

1.安装配置fastDFS、Nginx

可详见:
https://blog.csdn.net/weixin_42702917/article/details/104264992
https://blog.csdn.net/weixin_42702917/article/details/104265691

2.安装fdfs的python客户端

安装包可从这里下载:
https://github.com/Lincoln77/fdfs-with-nginx

  1. 进入项目虚拟环境workon dailyfresh
  2. 进入fdfs_client-py-master.zip所在目录
  3. pip install fdfs_client-py-master.zip

3.在项目目录下的utils中新建python package

在这里插入图片描述

  1. 将client.conf文件存放在该目录下
    更改两处配置项:
    在这里插入图片描述
    base_path的路径必须为以及创建好的目录

  2. 从fdfs目录下新建storage.py
    在这里插入图片描述
    代码如下:

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


class FDFSStorage(Storage):
    """fast dfs文件存储类"""
    def __init__(self, client_conf=None, base_url=None):
        """初始化"""
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf

        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:包含你上传文件内容的File对象

        # 1.创建一个Fdfs_client对象
        client = Fdfs_client(self.client_conf)

        # 2.上传文件到fast dfs系统中
        res = client.upload_by_buffer(content.read())
        # 返回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
        # }
        if res.get('Status') != 'Upload successed.':
            # 上传失败
            raise Exception('上传文件到fast dfs失败')

        # 3.获取返回的文件ID
        filename = res.get('Remote file_id')

        return filename

    def exists(self, name):
        """
		如果提供的名称所引用的文件在文件系统中存在,则返回True,
		否则如果这个名称可用于新文件,返回False。
		"""
		# 由于文件并没有存储在django的文件系统中,所以永远False
        return False

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

在项目settings中新增和更改配置项

# 设置django的文件存储类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'

# 设置FDFS使用的client.conf文件路径
FDFS_CLIENT_CONF = './utils/fdfs/client.conf'

# 设置fdfs存储服务器上nginx的ip和端口号
FDFS_URL = 'http://192.168.190.130:8888/'

配置好后,就可以通过管理员页面来上传图片,渲染模板时,{{ xxxx.image.url }}<img src=nginx所在的Ip和端口号/文件id>,通过这样让访问者直接去nginx服务器所在电脑获取图片,而不是去django服务器,从而提高网站提供图片的效率。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值