首页 > 编程语言 >自定义python Django文件存储系统

自定义python Django文件存储系统

时间:2022-12-23 13:55:47浏览次数:36  
标签:文件 name 自定义 python Django url client conf base

在学习Django框架的时候,我们已经讲过,Django自带文件存储系统,但是默认文件存储在本地,在本项目中,我们需要将文件保存到FastDFS服务器上,所以需要自定义文件存储系统。

自定义文件存储系统的方法如下:

1)需要继承自django.core.files.storage.Storage,如

from django.core.files.storage import Storage

class FastDFSStorage(Storage):
    ...

2)支持Django不带任何参数来实例化存储类,也就是说任何设置都应该从django.conf.settings中获取

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

class FastDFSStorage(Storage):
    def __init__(self, base_url=None, client_conf=None):
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf

3)存储类中必须实现_open()_save()方法,以及任何后续使用中可能用到的其他方法。

  • _open(name, mode='rb')

    被Storage.open()调用,在打开文件时被使用。

  • _save(name, content)

    被Storage.save()调用,name是传入的文件名,content是Django接收到的文件内容,该方法需要将content文件内容保存。

    Django会将该方法的返回值保存到数据库中对应的文件字段,也就是说该方法应该返回要保存在数据库中的文件名称信息。

  • exists(name)

    如果名为name的文件在文件系统中存在,则返回True,否则返回False。

  • url(name)

    返回文件的完整访问URL

  • delete(name)

    删除name的文件

  • listdir(path)

    列出指定路径的内容

  • size(name)

    返回name文件的总大小

    注意,并不是这些方法全部都要实现,可以省略用不到的方法。

4)需要为存储类添加django.utils.deconstruct.deconstructible装饰器

我们在meiduo_mall/utils/fastdfs目录中创建fdfs_storage.py文件,实现可以使用FastDFS存储文件的存储类如下

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


@deconstructible
class FastDFSStorage(Storage):
    def __init__(self, base_url=None, client_conf=None):
        """
        初始化
        :param base_url: 用于构造图片完整路径使用,图片服务器的域名
        :param client_conf: FastDFS客户端配置文件的路径
        """
        if base_url is None:
            base_url = settings.FDFS_URL
        self.base_url = base_url
        if client_conf is None:
            client_conf = settings.FDFS_CLIENT_CONF
        self.client_conf = client_conf

    def _open(self, name, mode='rb'):
        """
        用不到打开文件,所以省略
        """
        pass

    def _save(self, name, content):
        """
        在FastDFS中保存文件
        :param name: 传入的文件名
        :param content: 文件内容
        :return: 保存到数据库中的FastDFS的文件名
        """
        client = Fdfs_client(self.client_conf)
        ret = client.upload_by_buffer(content.read())
        if ret.get("Status") != "Upload successed.":
            raise Exception("upload file failed")
        file_name = ret.get("Remote file_id")
        return file_name

    def url(self, name):
        """
        返回文件的完整URL路径
        :param name: 数据库中保存的文件名
        :return: 完整的URL
        """
        return self.base_url + name

    def exists(self, name):
        """
        判断文件是否存在,FastDFS可以自行解决文件的重名问题
        所以此处返回False,告诉Django上传的都是新文件
        :param name:  文件名
        :return: False
        """
        return False

 

标签:文件,name,自定义,python,Django,url,client,conf,base
From: https://www.cnblogs.com/wzcc/p/17000523.html

相关文章

  • Python从入门到精通(第2版)——pyuic5: error: no such option: -m的问题解决
    前言在学习《Python从入门到精通(第2版)》的第15章GUI界面编程——15.2.4将.ui文件转换为.py文件时,按照书中步骤出错时的问题解决,希望对同样学习本书的同学有所帮助。问......
  • Python | Opencv的人脸检测和人类识别
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • docker保持环境一致、镜像、容器、仓库、配置加速器、命令、dockerfile、部署django、
    如何保持环境一致?pip3freeze>requerment.txtpipinstall-rrequerment.txt1.环境不一致2.配置文件不一致3.技术水平不一致,导致部署环境快慢不一致docker一处编译,到处运......
  • Linux服务器安装python3.7环境
    安装python3.7依赖yum-yinstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-......
  • python数据分析练习
    第一部分:数据类型处理数据加载字段含义:user_id:用户IDorder_dt:购买日期order_product:购买产品的数量order_amount:购买金额df=pd.read_csv('../data/CDN......
  • Python网络爬虫——爬取和分析福建二手房房价及各项数据
    一、 选题的背景介绍随着越来越多城市的房地产市场进入存量时代,二手房市场的地位愈发重要,其走势对于房地产整体市场的影响也逐渐加强。在很多二手房市场规模占比较高的一......
  • Vue 自定义事件
    组件的自定义事件使用场景A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)绑定自定义事件在父组件中:<HelloWorld@customEv......
  • 如何使用 Python 进行内存管理
    关于首先python进行内存管理就不得不提到Python解释器在何种情况下会释放变量的内存。Python引用了内存计数这一简单的计数来控制。当一个变量的引用计数为0的时候,就会被解......
  • Django序列化器配置分页器
    1.编写分页器方法fromrest_frameworkimportpaginationclassPagination(pagination.PageNumberPagination):defget_paginated_data(self,data):ret......
  • Python免杀过360
    本文章仅供参考学习作者:mantou博客地址:https://www.cnblogs.com/mantou0/分离免杀这个我就不多说了,效果确实不错,网上关于分离免杀的也有很多文章不分离过360一个exe,......