2019-06-28【FastDFS笔记(二): Django中使用FDFS】

写在前面

上一篇讲了fdfs如何安装,这篇讲一下fdfs如何在django项目中使用。

安装fast_client

  • 获取安装包
    链接:https://pan.baidu.com/s/1LMS3fQmFSmZcAicwDLzL1Q 密码:g29f

  • 进入项目的虚拟环境,然后安装

pip install fast_client-py-master.zip

django默认文件上传

Django默认上传文件,保存文件使用的是 FileSyestemStorage

  • save方法实现文件的保存,保存到指定的settings.py的 MEDIA_ROOT 路径下方

修改django默认文件上传行为

现在我们需要保存到fastdfs中,但是不能修改FileSyestemStorage的源码

  • 1、如果你需要修改文件存储的行为,只需要继承storage类,
# 自定义文件存储类
# util --> fdfs --> storage.py


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

class FDFSStorage(Storage):
    '''fdfs文件存储类'''

    def _open(self, name, mode='rb'):
        '''打开文件时使用'''
        # 我们这里不打开文件,所以直接pass即可
        pass

    def _save(self, name, content):
        '''保存文件时使用'''
        # name: 你选择的上传文件的名字
        # content: File类的对象,包含你上传文件内容的File对象,这个文件要上传到fastdfs

        # 创建一个Fdfs_client对象
        client = Fdfs_client('./utils/fdfs/client.conf')# 指定配置文件
        # 配置文件的路径应该是相对于项目的路径,而不是当前代码文件所在的路径


        # 上传文件到fast_dfs系统中
        res = client.upload_by_buffer(content.read())
        # upload_by_filename: 根据文件名字上传文件
        # upload_by_buffer: 根据文件内容上传文件


        # 返回的字典的格式
        # 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 success else None

        # 查看上传是否成功
        if res.get('Status') != 'Upload successed.':
            # 上传失败
            # 谁调用这个方法,谁处理异常,所以直接抛出异常
            raise Exception('上传文件到fastdfs失败')

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

        # 返回的是什么内容,在表中保存的就是这部分内容,对于fastdfs,remote_file_id就是相应的文件路径,保存这个即可
        return filename

        # 调用save方法之前,调用exist方法,如果提供的名称的所引用的文件在文件系统中存在,返回True,否则如果这个名称可用于新文件,返回false
        def exists(self, name):
            '''django判断文件是否可用'''
            return False
  • 2、设置fdfs的配置文件 client.conf
# connect timeout in seconds
# default value is 30s
connect_timeout=10

# network timeout in seconds
# default value is 30s
network_timeout=60

# the base path to store log files
base_path=/Users/yuanjun/Desktop
# 存储文件的地址

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address

tracker_server=ali2.teeh.cn:22122
# 修改为你的服务器ip

#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

# if use connection pool
# default value is false
# since V4.05
use_connection_pool = false

# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600

# if load FastDFS parameters from tracker server
# since V4.05
# default value is false
load_fdfs_parameters_from_tracker=false

# if use storage ID instead of IP address
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# default value is false
# since V4.05
use_storage_id = false

# specify storage ids filename, can use relative or absolute path
# same as tracker.conf
# valid only when load_fdfs_parameters_from_tracker is false
# since V4.05
storage_ids_filename = storage_ids.conf


#HTTP settings
http.tracker_server_port=80

#use "#include" directive to include HTTP other settiongs
##include http.conf
  • 3、修改settings.py的文件保存方式为定义的FDFSStorage类
DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
  • 4、添加url方法

对于字段中的goods.image只是保存的字段的内容
所以需要添加.url ,调用url方法,可以获得图片的路径,这样在使用的使用直接 obj.image.url 可以直接从nginx获取图片

class FDFSStorage(Storage):
    '''fdfs文件存储类'''
    ...
    def url(self, name):
        '''返回访问文件的url路径'''
        return self.base_url + name

BUG汇总

保存的时候报错,提示需要安装以下两个包,安装好了即可

  • 安装mutagen
  • 安装requests

你可能感兴趣的:(2019-06-28【FastDFS笔记(二): Django中使用FDFS】)