zoukankan      html  css  js  c++  java
  • 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实现 蓝桥杯VIP 算法提高 交换Easy
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法提高 多项式输出
    Java实现 蓝桥杯VIP 算法训练 矩阵乘方
    QT中给各控件增加背景图片(可缩放可旋转)的几种方法
    回调函数实现类似QT中信号机制
    std::string的Copy-on-Write:不如想象中美好(VC不使用这种方式,而使用对小字符串更友好的SSO实现)
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/13887235.html
Copyright © 2011-2022 走看看