跳转到主要内容

Django 时间令牌文件存储

项目描述

这是Django的< cite>FileSystemStorage的一个简单扩展,它添加了一个携带共享令牌的URL参数,该令牌只在定义的期限内有效。

此外,还有一个类似的时间约束文件上传槽机制可用。

功能

带有令牌安全URL的文件存储

这是Django < cite>FileSystemStorage的替代品,如果媒体文件由Django本身提供,则可使用。如果媒体文件由独立的Web服务器提供,则目前无法使用。

存储及其伴随视图执行以下操作

  • 当生成存储文件的URL时,会生成一个基于HMAC的令牌

  • 令牌及其生成时的时间戳作为请求参数附加到URL上

  • 通过随附视图检索文件时,使用请求的文件名和传递的时间戳重新计算基于HMAC的令牌

  • 只有当令牌匹配,并且已配置的超时时间未过时,才会提供文件

基于签名的令牌确保在以下情况下令牌无效:

  • 文件名更改

  • 时间戳更改

  • 文件的mtime更改

  • SECRET_KEY更改

时间限制上传时段

上传时段机制可用于通用地处理无法使用常规请求上传文件的客户端。一个例子是使用GraphQL与Django通信的客户端,因为GraphQL不支持文件上传,而是建议在带外进行上传。

使用Titofisto的上传时段机制,调用代码可以请求一个安全的URL,并将其分发给客户端。当客户端将其文件POST到端点时,之前提供的回调被调用以处理上传的文件。

安装

要将django-titofisto添加到项目,首先将其添加为项目的依赖项,例如使用poetry

$ poetry add django-titofisto

django-titofisto将使用基础FileSystemStorage来完成几乎所有事情,包括确定MEDIA_ROOT。它只是在基础FileSystemStorage.url()方法返回的任何内容中添加一个令牌作为URL参数。

将以下内容添加到您的设置中

DEFAULT_FILE_STORAGE = "titofisto.TitofistoStorage"
TITOFISTO_TIMEOUT = 3600  # optional, this is the default
TITOFISTO_PARAM = "titofisto_token"  # optional, this is the default

将以下内容添加到您的URL配置中

from django.conf import settings
from django.urls import include, path

urlpatterns += [
    path(settings.MEDIA_URL.removeprefix("/"), include("titofisto.urls")),
]

Django将在配置的MEDIA_URL下开始提供媒体文件。

提供公共媒体文件

有时,可能存在一些媒体文件,例如favicons,您希望无需任何身份验证即可访问。默认情况下,django-titofisto将使用令牌提供存储在public目录中的所有文件。您可以使用这些设置禁用或配置此行为。

TITOFISTO_USE_PUBLIC_NAMESPACE = True # optional, this is the default
TITOFISTO_PUBLIC_NAMESPACE = "public/" # optional, this is the default

使用时间限制上传时段

要启用文件上传机制,必须设置一个设置,因为默认的upload/前缀可能会覆盖预期的媒体文件URL。

TITOFISTO_ENABLE_UPLOAD = True
TITOFISTO_UPLOAD_NAMESPACE = "titofisto/upload/"

使用上传时段机制的一个简化示例是

from titofisto.views import TitofistoUploadView

def handle_file(request, pk):
    instance = MyModel.objects.get(pk=pk)
    instance.photo = request.FILES["photo"]
    instance.save()

# This gets an uplaod URL to pass on to the client
# On upload, the handler above will be called, with 15 as positional argument
upload_url = TitofistoUploadView.get_upload_slot(
    "mymodule.handle_file",
    (15,)
)

致谢

django-titofisto是由其团队为AlekSIS学校信息系统开发的

Copyright © 2021, 2023 Dominik George <dominik.george@teckids.org>
Copyright © 2021 Jonathan Weth <dev@jonathanweth.de>

由以下组织支持