将 S3 上传/浏览与 django-tinymce 集成

2024-01-12

我一直在寻找有关如何将 Amazon S3 与 TinyMCE 集成的资源。到目前为止我想到的最好的链接是:http://forums.aurigma.com/yaf_postst4033_Amazon-S3-File-Manager-for-TinyMCE-and-CKEditor.aspx http://forums.aurigma.com/yaf_postst4033_Amazon-S3-File-Manager-for-TinyMCE-and-CKEditor.aspx

有人有将其集成到 Django 应用程序中的经验吗?如果没有,有哪些用于富文本编辑和从 S3 提取图像的替代解决方案?


如果有人最近像我一样搜索过这个问题,并且需要一个解决方案来让 django-tinymce4-lite 与 django-storages 和 django-filebrowser-no-grappelli 一起工作,我已经通过执行以下操作设法让它工作:

1)遵循这个优秀的教程:https://karansthr.gitlab.io/fosstack/how-to-set-up-tinymce-in-django-app/ https://karansthr.gitlab.io/fosstack/how-to-set-up-tinymce-in-django-app/

2) 当涉及到让 s3 部分工作时,您需要安装 django-storages 并按照说明中的说明设置 mediastorageshere https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html

3)您需要创建 S3Boto3Storage 的子类并将其设为您的DEFAULT_FILE_STORAGE如下:

DEFAULT_FILE_STORAGE = 'path.to.module.MediaStorage'

4) 在该模块内使用以下 API 创建 MediaStorage 类以与 FileBrowser 一起使用

class MediaStorage(S3Boto3Storage):
    location = settings.MEDIAFILES_LOCATION
    isfilecached = {}

    def isdir(self, name):
        if not name:  # Empty name is a directory
            return True

        if self.isfile(name):
            return False

        return True

    def isfile(self, name):
        if len(name.split('.')) > 1:
            return True
        try:
            name = self._normalize_name(self._clean_name(name))
            if self.isfilecached.get(name) is not None:
                return self.isfilecached.get(name)

            f = S3Boto3StorageFile(name, 'rb', self)
            if "directory" in f.obj.content_type:
                isfile = False
            else:
                isfile = True
        except Exception:
            isfile = False
        self.isfilecached[name] = isfile
        return isfile

    def move(self, old_file_name, new_file_name, allow_overwrite=False):

        if self.exists(new_file_name):
            if allow_overwrite:
                self.delete(new_file_name)
            else:
                raise "The destination file '%s' exists and allow_overwrite is False" % new_file_name

        old_key_name = self._encode_name(self._normalize_name(self._clean_name(old_file_name)))
        new_key_name = self._encode_name(self._normalize_name(self._clean_name(new_file_name)))

        k = self.bucket.meta.client.copy(
            {
                'Bucket': self.bucket.name,
                'Key': new_key_name
            },
            self.bucket.name,
            old_key_name
        )

        if not k:
            raise "Couldn't copy '%s' to '%s'" % (old_file_name, new_file_name)

        self.delete(old_file_name)

    def makedirs(self, name):
        name = self._normalize_name(self._clean_name(name))
        return self.bucket.meta.client.put_object(Bucket=self.bucket.name, Key=f'{name}/')

    def rmtree(self, name):
        name = self._normalize_name(self._clean_name(name))
        delete_objects = [{'Key': f"{name}/"}]

        dirlist = self.listdir(self._encode_name(name))
        for item in dirlist:
            for obj in item:
                obj_name = f"{name}/{obj}"
                if self.isdir(obj_name):
                    obj_name = f"{obj_name}/"
                delete_objects.append({'Key': obj_name})
        self.bucket.delete_objects(Delete={'Objects': delete_objects})

    def path(self, name):
        return name

    def listdir(self, name):
        directories, files = super().listdir(name)
        if '.' in files:
            files.remove('.')
        return directories, files

    def exists(self, name):
        if self.isdir(name):
            return True
        else:
            return super().exists(name)

    def get_modified_time(self, name):
        try:
            # S3 boto3 library requires that directorys have the trailing slash
            if self.isdir(name):
                name = f'{name}/'
            modified_date = super().get_modified_time(name)
        except Exception:
            modified_date = timezone.now()
        return modified_date

    def size(self, name):
        try:
            # S3 boto3 library requires that directorys have the trailing slash
            if self.isdir(name):
                name = f'{name}/'
            size = super().size(name)
        except Exception:
            size = 0
        return size

5) 确保将这些放入您的 Django 设置中:

MEDIAFILES_LOCATION = 'media'
DEFAULT_FILE_STORAGE = 'path.to.module.MediaStorage'

FILEBROWSER_DEFAULT_PERMISSIONS = None
FILEBROWSER_LIST_PER_PAGE = 5  # Speeds up the load of the filebrowser files

AWS_PRELOAD_METADATA = True     # Speeds up the load of the filebrowser files
AWS_QUERYSTRING_AUTH = False    # Speeds up the load of the filebrowser files

希望这可以帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 S3 上传/浏览与 django-tinymce 集成 的相关文章

  • 我应该在什么模型中添加ManyToManyField?

    我读了有关多对多关系的文档 https docs djangoproject com en dev ref models fields ref manytomany和examples https docs djangoproject com
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 确定网站的唯一访问者

    我正在创建一个 django 网站 使用 Apache2 作为服务器 我需要一种方法来以完整的证据方式确定我的网站 特别是每个页面 的唯一访问者数量 不幸的是 用户会有很大的动机去尝试 玩弄 跟踪系统 所以我正在努力证明这一点 有什么办法可
  • 在 ubuntu 中卸载 python 模块

    我必须删除一个名为 django 的 python 模块 一种流行的模块 因为我安装了错误的版本 1 3 py 2 6 中的 beta 如何卸载这个模块 请解释一下 因为我只在 Windows 中使用过 python 而从未在 Ubuntu
  • python:日志记录:我们可以向记录器添加多个过滤器吗?考虑哪一个

    我试图了解 Python 日志记录中的多个过滤器 一个在配置中定义 另一个在代码中定义 如何工作 我正在开发一个 Django 项目 下面是我在 settings py 中的记录器配置 我的目标是switch on and switch o
  • 以敏捷/BDD 方式在 Django 中使用 Doctests 的示例

    我有兴趣学习如何以更敏捷 BDD 的方式进行文档测试和单元测试 我发现了一些看似合理的教程 但它们只是缩略图 我真正想看到的是一些采用 BDD 风格开发的 Django 项目的源代码 我不清楚的是如何处理请求对象等 我遇到过这样的情况 我已
  • 使用 pip3 安装 mysqlclient 时遇到问题

    我正在尝试使用 Django 设置 python 3 6 环境 安装说明说我应该安装 mysqlclient 才能连接到 mySQL 我明白了 dennis django sudo H pip3 install mysqlclient Co
  • 从 Grails 控制器渲染视频内容

    毫无疑问又是一个愚蠢的新手问题 我在 Grails 控制器中有一个字节数组 其中包含视频文件 确切地说是 mp4 文件 的内容 我熟悉如何从 grails 控制器渲染 JSON XML 和其他基本类型 但我找不到任何显示如何输出视频的示例
  • 在 Django 中使用 prefetch_lated 连接 ManyToMany 字段

    我可能遗漏了一些明显的东西 但我在连接 ManyToMany 字段以在 Django 应用程序中工作时遇到问题 我有两个模型 class Area models Model name CharField class Role models
  • Django“模型”对象不可迭代

    我有一张表 其中显示了已注册的员工 我想根据他们的数据库生成一个简单的 HTML 页面 其中包括他们的姓名 id 职称等 为此 我将一个 id 传递给视图 以便它可以获取相应用户的详细信息并向我显示 一切正常 直到出现错误对象不可迭代 下面
  • 在 django vanilla CreateView 上设置当前用户

    我想用当前登录的用户更新我的模型 我正在使用 django vanilla views 为了存储新记录 我尝试使用 CreateView 我不想在表单上显示用户 只需自动更新即可 这是我的模型 class Measurement model
  • AWS beanstalk + Django:502 错误网关 - ModuleNotFoundError:没有名为“应用程序”的模块

    我正在尝试将 Django 项目部署到 Elastic Beanstalk 我正在遵循他们的指南 https docs aws amazon com elasticbeanstalk latest dg create deploy pyth
  • 操作错误:游标“_django_curs_”不存在

    我们有一个由 django postgresql 和 heroku 提供支持的在线商店 Web 应用程序 对于特定的活动 您可以将活动视为要购买的产品 我们已成功售出 10 000 份以上的副本 然而 根据我们的 Sentry 报告 我们的
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • Django South - 将 null=True 字段转换为 null=False 字段

    我的问题是 转变的最佳做法是什么null True场变成null False使用 Django South 的字段 具体来说 我正在与ForeignKey 你应该先写一个数据迁移 http south aeracode org docs t
  • 在 Heroku 上安装 GeoDjango

    我正在尝试构建一个使用 GeoDjango 的网络应用程序 该应用程序将托管在 Heroku 上 但我在其中遇到了问题 我在用this https github com dulaccc heroku buildpack geodjango构
  • 使用 python 制作本地服务器应用程序的最佳方法

    我想要简单轻松地集成 python 和 vba 人们 如果他们在阅读本文后亲自见到我 阅读本文可能会杀了我 但我正在使用 django 开发服务器来实现此目的 有没有什么简单又好的方法 仅举个例子 我想使用 python 模块 openpy
  • django 模板上的 vscode html 自动套用格式

    我喜欢 VSCode 的保存自动格式功能 直到它弄乱了我的模板代码 它错误地将我的 django 模板语法格式化为一行代码 有时非常长的一行 所以不用这段代码 for row in ABCDEFGH tr for col in 123456
  • 内存高效的大型数据集流式传输到 S3

    我正在尝试使用 SQL alchemy 复制 S3 大型数据集 大于 RAM 我的限制是 我需要使用 sqlalchemy 我需要将内存压力保持在最低水平 我不想使用本地 filsystem 作为中间步骤将数据发送到 s3 我只想通过管道将
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html

随机推荐

  • 如何在 Doctrine 中转义单引号

    这是一个关于教义的非常基本的问题 单引号如何转义 例如 标题需要转义 因为它包含单引号 query this gt entityManager gt createQuery SELECT p from RTH Entity Prod p J
  • 如何浏览 Oracle 服务器上的数据库?

    因此 我作为一名 SQL Server 开发人员 早在很早以前就编写过一些 PL SQL 但实际上却一无所知 我有一台笔记本电脑 它运行 Oracle 笔记本电脑上有一个数据库 我需要查看一下 但我或我能与之交谈的其他人都不知道它的名字 我
  • 如何在spyder中添加python控制台

    升级spyder版本3 2 1后 我在spyder中找不到python控制台 当我通过Ipython控制台交互式地绘制数据时很不方便 如何将python控制台添加到spyder中 Spyder 开发者在这里 Spyder 中完全删除了 Py
  • 在将 XElement 添加到匿名对象之前,如何检查该 XElement 是否不为 null?

    我正在从 XML 文件填充匿名对象 到现在为止 commentary Elements Commentator 总是有一个值 所以我从来不需要检查是否为空 但我不得不删除它 现在当它尝试读取该行时它失败了 我正在查看代码 但不知道要更改什么
  • 如何忽略 Subversion 中的文件?

    如何忽略 Subversion 中的文件 另外 如何找到不受版本控制的文件 此答案已更新以匹配 SVN 1 8 和 1 9 的行为 您有 2 个问题 将文件标记为忽略 我所说的 忽略文件 是指该文件不会出现在列表中 即使是 未版本控制 您的
  • Tornado 异步 HTTP 增量返回结果

    据我从tornado gen模块文档中了解到 tornado gen Task由tornado gen Callback和tornado gen Wait组成 每个回调 等待对都与唯一键关联 tornado web asynchronous
  • 避免预标记内的边距[重复]

    这个问题在这里已经有答案了 如何避免内部边距pre tag p Some text p pre code Some code code pre p Some text p 电流输出 所需的输出 当前的解决方案是手动删除标记中的缩进 如下所示
  • 如何从 Doctrine Fixture 参考中获取实体?

    我在项目中添加了依赖于彼此引用实体对象的数据装置 在数据夹具一中 我添加了实体引用 例如 GroupEntity Fixtures php file this gt addReference GROUP USER groupUser thi
  • C# SHA1 与 PHP SHA1...结果不同?

    我正在尝试从字符串计算 SHA 1 哈希值 但是当我使用 php 的 sha1 函数计算字符串时 我得到的结果与在 C 中尝试时不同 我需要 C 来计算与 PHP 相同的字符串 因为来自 php 的字符串是由我无法修改的第 3 方计算的 如
  • 当我尝试初始化 GoogleMap 对象时,出现 NullPointerException

    我正在尝试在我的片段类之一中显示一张地图 我在 XML 类中为地图创建了一个片段 并按如下方式使用它 Override public View onCreateView LayoutInflater inflater ViewGroup c
  • javascript 引擎能够识别 HTML 编码的字符串,这怎么可能呢?

    出色地 这个夜晚对我来说是一个非常奇怪的夜晚 很抱歉在之前创建了另外两个问题后又创建了一个新问题 但这完全是另一个论点 如果我在这里得到答案 我也会得到这些问题的答案 所以请有人听我说并尝试理解 这一切都始于通过 aspx 代码隐藏文件生成
  • 如何在 C# 中使用 zxing 应用 Reed-Solomon 算法

    我想通过嘈杂的通道传输二进制数据 我读到 Reed Solomon 是一个很好的检测错误的 ECC 算法 问题是我不理解这个算法的输入 这是我对 zxing net 的天真失败的尝试 int toEncode 123 232 432 var
  • git:可靠地切换到分离的 HEAD,然后稍后恢复 HEAD,所有这些都来自脚本

    这是场景 我有一个运行一些测试的脚本 我需要制作另一个接受 git 提交名称作为参数的脚本 然后执行以下操作 保存当前提交状态 分支名称或未命名提交 在指定的提交处切换到分离的 HEAD 针对该提交运行测试脚本 切换回来 因此 HEAD 与
  • 找不到用于渲染完成的 ReportViewer 事件

    当 ReportViewer 控件完成渲染时 我试图触发一个事件 以删除自定义进度 状态指示器 我已经研究了 ReportViewer 控件的事件 但似乎找不到在报表完成时实际触发的事件 我正在使用 Visual Studio 2010 和
  • 将标签放置在分档/步进颜色条指南中分档的中间?

    推理 我想轻松使用现成的连续刻度 来自任何提供的包 scale continuous等 对于类似序数因子的数据 例如mtcars cyl 因为这些数据只包含几种离散值 所以我想直接标记图例键 而不是容器限制 怎么做 library ggpl
  • 如何在写入 CSV 文件时附加到新行[重复]

    这个问题在这里已经有答案了 我想在写入时附加到 CSV 文件中的新行 当前的 CSV 文件如下所示 a b c 1 1 1 我的附加到 CSV 文件的代码 with open mycsvfile csv a as f writer csv
  • 如何实现更高效的搜索功能?

    在我的数据库中有 3 列 分别是姓名 年龄 性别 在程序中 我只想使用 1 个搜索按钮 单击该按钮时 程序会确定哪 3 个文本框已输入并搜索正确的数据 您如何处理查询 例如 如果姓名和性别有文本 则查询 Select from table
  • Java 中的类型转换和自动类型提升

    让我们考虑一下 Java 中的一些简单表达式 byte var 0 var byte var 1 这里 在上面的语句中 显然由于自动类型提升而需要类型转换 表达式的评估 var 1 自动提升为 int 因此 必须显式转换为 byte 以将其
  • 在运行时更改时,表单验证会忽略语言

    我正在使用 CodeIgniter 构建多语言 Web 应用程序 我有英语和其他语言 system languages 文件夹 我创建了一个负责在运行时更改工作语言的模型 默认情况下 CodeIgniter 以法语工作 如中定义 appli
  • 将 S3 上传/浏览与 django-tinymce 集成

    我一直在寻找有关如何将 Amazon S3 与 TinyMCE 集成的资源 到目前为止我想到的最好的链接是 http forums aurigma com yaf postst4033 Amazon S3 File Manager for