gpt4 book ai didi

python - 在Django中提供静态文件的最佳做法

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:49 25 4
gpt4 key购买 nike

在Django为制作提供图像文件的最佳实践是什么?我想用静态图片来回应,我正在将我的django应用程序部署到heroku。
在效率或安全性方面,使用django.middleware.security.SecurityMiddleware而不是whitenoise.middleware.WhiteNoiseMiddleware有什么明显的缺点吗?
下面的代码与使用whitenoise相比是否效率低下?为settings.MEDIA_ROOT中的图像提供服务是否与为静态文件提供服务相同?

img =  os.path.join(settings.MEDIA_ROOT, filename)
try:
with open(img, "rb") as f:
return HttpResponse(f.read(), content_type="image/jpeg")
except IOError:
failedResponse = '{"detail": "No image found"}'
return HttpResponse(failedResponse)

最佳答案

你的评论:
这里的whitenoise文档说,我们不应该同时使用中间软件,我只想知道在django.security上使用whitenoise是否有缺点–manan mehta 30分钟前
不,它没有这么说-文档的那一部分提到了中间件类的顺序。您可以很高兴地在django的安全中间件中使用whitenoise。
以下文件摘录:
编辑settings.py文件并将whitenoise添加到middleware\u类列表中,除django的securitymiddleware之外的所有其他中间件:

MIDDLEWARE_CLASSES = [  
# 'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# ...
]

snakefcz建议强制django服务于static并不是一个好主意-whitenoise包被设计为一种通过django服务于static的高性能方法。请参见 heroku docsWhitenoise docs
回复您的编辑:
在django中,static是指在开发过程中创建的js/css/images之类的东西,这些东西在应用程序部署时不会改变(保持静态)。媒体是用户上传的图像和视频,或生成的图像(如缩略图)。
Django建议将静态和媒体分别存储在静态根目录和媒体根目录中然后在生产环境中,通常在这些目录中为url静态url和媒体url配置web服务器。whitenoise通过正确地提供这些文件夹中的文件而简化了一些事情,而不必配置web服务器。
让django正确地提供图像(静态或媒体)的主要关注点如下:
性能-django没有针对服务资产进行优化,因此它比通过nginx/apache这样的web服务器服务要慢。许多图像请求也会减慢标准页面请求的速度,因为它们会排队并导致更长的响应时间。当你的网站很小的时候,这可能并不重要,但是当你有流量的时候改变网站的工作方式是很棘手的!
缓存头-django不知道在返回图像时向图像添加缓存控制头,而whitenoise等包则会添加合理的缓存头(最重要的是缓存过期时间,例如用户的浏览器在图像上挂起的时间)。
根据返回图像的方式,还有其他一些whitenoise可能不处理django的头文件:
媒体类型-浏览器需要知道如何处理他们得到的响应,所以有一个标题叫做 Content-Type。使用上面的代码,您将以图像的形式返回每个文件-如果用户要求PNG怎么办?
内容长度-浏览器使用内容长度(响应的大小)来显示进度条和其他优化(例如以块为单位读取响应)。
压缩-大多数浏览器和web服务器(以及whitenoise)支持压缩方法,如gzip或最近由google构建的brotli。web服务器压缩文件(通常是一次压缩,然后缓存压缩的文件)以最小化传输期间的带宽。根据图像和格式的不同,通常可以将图像压缩到其大小的60-70%左右。
lena位图演示:
❯ brew install gzip brotli

❯ gzip -k -v lena.bmp
lena.bmp: 18.3% -- replaced with lena.bmp.gz

❯ bro --input lena.bmp --output lena.bmp.bro

❯ ls -lh lena*
-rw-r--r--@ 1 alex staff 768K Feb 16 21:41 lena.bmp
-rw------- 1 alex staff 527K Feb 16 21:45 lena.bmp.bro
-rw-r--r--@ 1 alex staff 627K Feb 16 21:41 lena.bmp.gz

安全性-将服务静态资产留给web服务器的另一个原因是可能存在安全漏洞!
假设视图中提供图像的代码如下所示,url设置在 static/<filename>
img = os.path.join(settings.MEDIA_ROOT, filename)
with open(img, "rb") as f:
return HttpResponse(f.read(), content_type="image/jpeg")

想象一下,如果恶意用户导航到 yoursite.com/static//Users/alex/.ssh/id_rsa。然后文件名变为 /Users/alex/.ssh/id_rsa
filename = '/Users/alex/.ssh/id_rsa'
os.path.join(settings.MEDIA_ROOT, filename)
# '/Users/alex/.ssh/id_rsa'

然后视图读取Web服务器的私钥,并将其返回给恶意用户。哎呀!现在他们可以通过ssh连接到您的服务器。
Heroku上的媒体:
如果你要部署到Heroku,要记住一件事,那就是他们两人的工作方式。heroku dynos的创建和销毁非常频繁(每次部署,至少每天如此),因此您不能依赖文件系统。您还可以同时运行两个或多个dyno—它们是在数据中心的不同主机上运行的完全独立的容器,它们不共享文件系统。通常,如果您想处理用户上传的媒体,您将使用 Django-storages在s3(aws的存储服务)而不是文件系统上存储图像。您也可以将图像存储在数据库中,但这并不能很好地扩展。请参见 https://github.com/eknuth/django-heroku-s3-bootstrap-demo以获取在S3上存储媒体的Django应用程序示例。

关于python - 在Django中提供静态文件的最佳做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42261467/

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