...我有一个包含大量数据的Django应用程序和一个运行在Raspberry PI(OS=Debian12)上的MariaDB数据库.该应用程序使用Daphne作为Web服务器,因为其中还包含Django Channel组件(WebSocket).现在我想实现一个备份功能,它可以自动转储数据库,将转储与其他数据文件压缩在一起,并让浏览器自动下载ZIP文件.因此,我为下载制作了一个视图:

def downbackup(request): 
  if request.user.is_superuser:
    filename = '../temp/backup/backup.zip'
    sourcefile = open(filename, 'rb')
    return FileResponse(sourcefile)
  else:
    return(HttpResponse('No Access.'))

通过url从相关模板调用该视图,一切都很好.直到我们在现实生活中遇到大文件.在这种情况下(文件大小约6 GB),Daphne会立即停止操作,而Raspi崩溃得如此之深,以至于我不得不打开和关闭电源.此外,在Monorix中,我看到在这些崩溃之后,内存消耗激增.但在Daphne日志(log)、Django日志(log)(包括调试设置)也不在日志(log)CTL中.NGINX(反向代理)报告上行链路超时(504).我想我从Django文档中了解到,FileResponse缓冲文件以避免内存消耗,但这里一定出了什么问题.有什么 idea 和建议吗?

推荐答案

我强烈建议not使用Django作为文件服务器,它不打算以这种方式使用.典型地,例如,nginx与X-Accel-Redirect [nginx-doc]一起使用,使得django实质上表明文件在哪里,并且nginx然后可以以当存在X-Accel-Redirect时只有nginx提供文件的方式返回文件.

因此,从本质上讲,您使用的是:

def downbackup(request):
    if request.user.is_superuser:
        response = HttpResponse()
        response['Content-Disposition'] = 'attachment; filename=backup.zip'
        response['X-Accel-Redirect'] = '/protected/temp/backup/backup.zip'
        return response
    else:
        return HttpResponse('No Access.')

然后,nGINX服务器因此服务于protected路径,具有:

location /protected/ {
  internal;
  alias   /path/one/above/tmp/;
}

这不仅可以确保nginx缓存和流媒体没有问题,还可以导致nginx缓存某些文件,从而提高Web服务器的效率.

/protected/配置中的internal关键字意味着你不能从外部向这个路径发出请求.所以一个人不能访问/protected/temp/backup/backup.zip,它只能用于nginx中与"子服务器"的内部通信.

Python相关问答推荐

如何使用pandasDataFrames和scipy高度优化相关性计算

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

Pandas 有条件轮班操作

如何避免Chained when/then分配中的Mypy不兼容类型警告?

Python中的嵌套Ruby哈希

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

通过Selenium从页面获取所有H2元素

将数据框架与导入的Excel文件一起使用

log 1 p numpy的意外行为

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

如何在Python脚本中附加一个Google tab(已经打开)

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

无法在Docker内部运行Python的Matlab SDK模块,但本地没有问题

Scrapy和Great Expectations(great_expectations)—不合作

如何在PySide/Qt QColumbnView中删除列

numpy.unique如何消除重复列?

为什么'if x is None:pass'比'x is None'单独使用更快?

递归函数修饰器

来自Airflow Connection的额外参数

多个布尔条件的`jax.lax.cond`等效项