gpt4 book ai didi

django - 如何使用 Django ImageField,为什么要使用它?

转载 作者:行者123 更新时间:2023-12-03 23:35:13 28 4
gpt4 key购买 nike

到目前为止,我一直将图像文件名存储在 CharField 中,并将实际文件直接保存到 S3。对于我自己的使用来说,这是一个很好的解决方案。我想重新考虑使用 ImageField,因为现在会有其他用户并且文件输入验证是合适的。

我有几个问题在阅读后没有完全回答the docsthe source code用于 FileField(它似乎本质上是 ImageField 减去 Pillow 检查和维度字段更新功能)。

1) 为什么要使用 ImageField?或者更确切地说,为什么要使用 FileField?当然,它对于快速简单的表单和插入到 Django 模板中都很方便。但是是否有任何实质性的原因,例如。它是否明显可以防止漏洞利用和恶意上传?

2)如何写入字段文件?如果正确,文件可以被instance.imagefield读取(或者是 instance.imagefield.file ?),如果我想写信给它,我可以简单地执行以下操作吗?

@receiver(pre_save, sender=Image)
def pre_save_image(sender, instance, *args, **kwargs):
instance.imagefield = process_image(instance.imagefield)

3) 如何尝试使用特定文件名保存,然后如果随机生成的文件名已存在,则使用新文件名重试?例如,我现在使用我的代码执行此操作,如何使用 ImageField 完成此操作?我想在模型层这样做,因为如果我在 View 层重复尝试,那么 pre_save处理将再次运行,这是 ghetto(即使它不太可能在服务的生命周期内进行第二次尝试)。
for i in range(tries):
try:
name = generate_random_name()
media_storage.save(name + '.jpg', ContentFile(final_bytes))
break
except:
pass

4)在models.py pre_savepost_save信号和实际模型的 save() ,我怎么知道请求中是否有文件?即我想知道是否有新图像要保存,或者是否没有图像(对象中的其他字段正在更新并且图像本身保持不变)。

最佳答案

我没有看到 FileField 或 ImageField 比你今天所做的有任何优势。事实上,在我看来,处理上传的正确/现代/可扩展方式是让客户端(浏览器)将文件直接上传到 S3。

如果操作正确(从安全角度来看),此方案允许您以令人难以置信的方式扩展,而无需在您身边添加更多计算机功能。例如,考虑 100 人同时上传一张图片。您的服务器将需要接收所有这些数据,然后再将其上传到 S3。另一方面,您可以同时上传 1000 人,我可以向您保证 AWS 可以处理。您的服务器只需要处理 URL 的签名,这样的工作要少得多。

看看fine-uploader,它是一种很好的技术,可以用来处理高效的s3上传(分块加载、错误检查等):http://docs.fineuploader.com/endpoint_handlers/amazon-s3.html .谷歌“django fineuploader”来查找 Django 的示例应用程序。

就我而言,我使用一个模型和一对夫妇 CharFields ( bucket , key ) 加上一些其他特定于我的应用程序的东西。我的数据流如下:

  • Django 使用基于我的设置配置的精细上传小部件为页面提供服务。
  • Fineuploader 从 django 服务器(端点)请求一个签名的 URL,并使用它直接上传到 S3。
  • 上传完成后,fineUploader 向我的服务器发出另一个请求以注册上传完成,此时,我在数据库上创建我的对象。在这种情况下,如果上传失败,我永远不会在数据库上创建对象。
  • 在 AWS 方面,S3 触发了一个 Lambda 函数,我用它来创建一个缩略图,并将其存储回 S3。所以,我什至不使用自己的 CPU(例如 Celery)来调整大小。所以你看,我不仅可以让成千上万的用户同时上传,而且我可以并行调整这千张图片的大小,而且成本低于 EC2 工作人员的成本。
  • 我的 Django 模型还用作管理业务逻辑的包装器(例如 get_original_url()get_thumbnail_url() 之类的函数),因此上传后,我的模板很容易获得签名的只读 URL。

  • 简而言之,您可以根据需要实现自己的 Fineuploader 版本,或者使用许多替代方案,但假设您遵循 AWS 方面推荐的安全最佳实践(例如,创建一个仅对客户端具有写权限的特殊 IAM,甚至如果您使用的是签名 URL),那么 IMO 是处理上传的最佳实践,尤其是当您使用 S3 或类似工具来存储这些文件时。

    抱歉,如果我真的只是在回答问题 1,但如果您接受我对问题 1 的回答,则问题 2 和问题 3 不适用。

    关于django - 如何使用 Django ImageField,为什么要使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37336559/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com