一个可插拔的django媒体管理应用程序。
项目描述
欢迎使用django-medialibrary文档!
django-medialibrary 是一个可插拔的django应用程序,可以以透明的方式存储不同类型的媒体(音频、视频、图片)和特定文件的多个版本。
要解决的基本问题是以无缝的方式存储、检索和管理相同文件的多个版本。例如,用户上传了一个视频,您需要将其转换为不同的格式。对于用户来说,您希望在他的上传文件列表中只显示一个媒体,但您仍然希望在需要时提供所有生成的文件,此外,如果用户决定删除他的媒体,您希望删除所有版本。
这个应用程序的思路是使其以独立于应用程序和易于使用和扩展的方式存在。
功能
- 每个媒体类型都有唯一的入口点,user.medialibrary.shelf_set 
- 不同类型的书架,每种媒体类型可能有不同的登录方式。 shelf_set 包含不同的模型,每个模型都源自 medialibrary.models.Shelf。 
- 对原始文件的简单访问。 - myShelf = AudioShelf.objects.get(pk=1) myShelf.audio_set.all() # returns the list of audio files isinstance(myShelf.original, Audio) # return True, if a file is attached to myShelf myShelf.original.size, myShelf.original.url 
- 自定义管理器用于查询书架。 
- 使用 ShelfRelation 模型将书架绑定到项目中的任何对象,实现泛型关系。 
- 每种书架类型都可以有一个 ALLOWED_FORMATS 属性,列出可以在书架中保存的允许扩展名。 
- VideoShelves 可以附加缩略图图像(实际上是 ImageShelf 实例)。其中只有一个可以被标记为选中。myVideoShelf.thumbnail 属性返回选中的缩略图。 
前端 API
出于故意,我们没有在 html 前端上做任何工作,因为我们是通过 API 使用此应用的。开箱即提供的 API 有
- /audio/,/video/,/image/ - 用于上传和列出特定类型的媒体元素 
- /<pk>/ - 获取单个媒体元素的详细信息 
- /<pk>/add/ - 向媒体元素添加关系,期望的 json 格式为 - { 'model': 'app_name.model_name', 'object_id': 1 }
其中 app_name.model_name 是您附加的模型的自然键(自然键)。
自定义
除了文件存储的一般 django 设置外,还有一个自定义设置,即 FileFields 中使用的 upload_to 方法。
import datetime
def setup_s3_route(instance, filename=None):
    today = datetime.datetime.today()
    return 'media/%s-%02d-%02d/%s' % (today.year, today.month, today.day,
                                          filename)
from medialibrary import utils
utils.setup_upload_route = setup_s3_route
您可以为 ShelfRelation 模型上的 limit_choices_to 属性设置一个自定义参数。这样,您可以定义哪些应用可以与您的媒体元素建立关系。(例如,如果您在删除媒体时删除附加的记录,您可能不想将 django 权限记录附加到媒体)。默认为 无限制!
from medialibrary import utils from django.db import models utils.content_type_restriction = models.Q(app_label='auth', model='user')
添加新的媒体类型
medialibrary 可以很容易地通过添加新的媒体类型进行扩展。以下是一个添加新 DocumentShelf 模型的示例
from medialibrary.models import Shelf
class DocumentShelf(Shelf):
    ALLOWED_FORMATS = ('doc', 'docx', 'pdf', 'odf')
    def file_set():
        doc = "The file_set property."
        def fget(self):
            return self.audio_set
        return locals()
    file_set = property(**file_set())
在此简单的模型定义之后,用户的 user.medialibrary.shelf_set 将在适当的时候包含 DocumentShelf 实例。
安装
pip install django-medialibrary
或者您可以在 github 上找到该项目
运行独立测试
您可以通过以下方式运行测试
#创建一个虚拟环境并激活它
pip install -r test_requirements.txt
python runtests.py