• django filemanage 官方文档


    https://docs.djangoproject.com/en/3.1/topics/files/

    自定义存储;

    编写自定义存储系统

    如果需要提供自定义文件存储(一个常见的示例是在某个远程系统上存储文件),则可以通过定义自定义存储类来实现。您需要按照以下步骤操作:

    1. 您的自定义存储系统必须是的子类 django.core.files.storage.Storage

      from django.core.files.storage import Storage
      
      class MyStorage(Storage):
          ...
      
    2. Django必须能够在没有任何参数的情况下实例化您的存储系统。这意味着任何设置都应来自django.conf.settings

      from django.conf import settings
      from django.core.files.storage import Storage
      
      class MyStorage(Storage):
          def __init__(self, option=None):
              if not option:
                  option = settings.CUSTOM_STORAGE_OPTIONS
              ...
      
    3. 您的存储类必须实现_open()_save() 方法,以及适用于您的存储类的任何其他方法。有关这些方法的更多信息,请参见下文。

      另外,如果您的类提供本地文件存储,则它必须重写该path()方法。

    4. 您的存储类必须是可分解的, 以便在迁移中的字段上使用时可以序列化。只要您的字段具有本身可序列化的参数,就 可以django.utils.deconstruct.deconstructible为此使用类装饰器(Django在FileSystemStorage上使用的 装饰器)。

    默认情况下,以下方法会引发NotImplementedError,通常将被覆盖:

    但是请注意,并非所有这些方法都是必需的,因此可以有意省略。碰巧的是,有可能使每个方法都未实现,而仍然可以使用存储。

    举例来说,如果列出某些存储后端的内容确实很昂贵,则可以决定不实施Storage.listdir()

    另一个示例是仅处理写入文件的后端。在这种情况下,您将不需要实现任何上述方法。

    最终,由您决定采用哪种方法。保留一些未实现的方法将导致部分(可能已损坏)接口。

    您通常还需要使用专门为自定义存储对象设计的挂钩。这些是:

    _open名称mode ='rb'

    必填项

    由调用Storage.open(),这是存储类用于打开文件的实际机制。这必须返回一个File对象,尽管在大多数情况下,您将需要在此处返回一些实现特定于后端存储系统的逻辑的子类。

    _save名称内容

    由呼叫Storage.save()name会已经走过 get_valid_name()get_available_name(),而content将是一个 File对象本身。

    应该返回保存的文件名的实际名称(通常是name 传入的名称,但是如果存储需要更改文件名,请返回新名称)。

    get_valid_name名称

    返回适合与基础存储系统一起使用的文件名。name传递给此方法的 参数是发送到服务器的原始文件名,或者是(如果upload_to是可调用的)在删除任何路径信息之后该方法返回的文件名。覆盖此选项可自定义如何将非标准字符转换为安全文件名。

    提供的代码Storage仅保留原始文件名中的字母数字字符,句点和下划线,并删除所有其他内容。

    get_alternative_namefile_rootfile_ext
    Django 3.0的新功能。

    根据file_rootfile_ext 参数返回备用文件名默认情况下,在扩展名之前,在文件名后附加一个下划线和一个随机的7个字符的字母数字字符串。

    get_available_name名称max_length = None

    返回存储机制中可用的文件名,可能考虑了提供的文件名。根据name上述方法,传递给此方法参数将已经清除为对存储系统有效的文件名get_valid_name()

    文件名的长度将不超过max_length(如果提供)。如果找不到免费的唯一文件名,SuspiciousFileOperation则会引发异常。

    如果文件name已经存在,get_alternative_name()则被调用以获得备用名称。

  • 相关阅读:
    Java常用的技术网站
    Eclipse启动Tomcat时发生java.lang.IllegalArgumentException: <sessionconfig> element is limited to 1 occurrence
    MySQL存储过程动态SQL语句的生成
    GitHub起步创建第一个项目
    安装Java的IDE Eclipse时出现java.net.SocketException,出现错误Installer failed,show.log
    转:POI操作Excel导出
    POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)
    Java后台发送邮件
    (转)指针函数与函数指针的区别
    ROS下创建第一个节点工程
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/13887235.html
Copyright © 2020-2023  润新知