为了账号安全,请及时绑定邮箱和手机立即绑定

图像从部署到 heroku 的 django web 应用程序中消失

图像从部署到 heroku 的 django web 应用程序中消失

小怪兽爱吃肉 2022-12-27 17:16:45
我正在开发一个 django 项目,使用 django rest 框架编写 rest API 以在 android 应用程序中使用它们,我的主要想法是在 django 中开发后端,在 android 中开发前端,项目部署在 heroku 上。我的应用程序包含一些带有商品图片的库存,问题是当我上传图片时它成功上传了图片但一段时间后或更具体地说是几个小时后图片自行消失。这是我的 setting.py 文件"""Django settings for forBirds project.Generated by 'django-admin startproject' using Django 3.0.6.For more information on this file, seehttps://docs.djangoproject.com/en/3.0/topics/settings/For the full list of settings and their values, seehttps://docs.djangoproject.com/en/3.0/ref/settings/"""import osimport dj_database_url# Buld paths inside the project like this: os.path.join(BASE_DIR, ...)BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# Quick-start development settings - unsuitable for production# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!SECRET_KEY = ''# SECURITY WARNING: don't run with debug turned on in production!DEBUG = TrueALLOWED_HOSTS = ['*']# Application definitionINSTALLED_APPS = [    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'account',    'rest_framework',    'rest_framework.authtoken',    'Birds',]MIDDLEWARE = [    'django.middleware.security.SecurityMiddleware',    'django.contrib.sessions.middleware.SessionMiddleware',    'django.middleware.common.CommonMiddleware',    'django.middleware.csrf.CsrfViewMiddleware',    'django.contrib.auth.middleware.AuthenticationMiddleware',    'django.contrib.messages.middleware.MessageMiddleware',    'django.middleware.clickjacking.XFrameOptionsMiddleware',    'whitenoise.middleware.WhiteNoiseMiddleware',]ROOT_URLCONF = 'forBirds.urls'
查看完整描述

2 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

Heroku 文件系统是短暂的——这意味着在 dyno 运行时对文件系统的任何更改只会持续到 dyno 关闭或重新启动。每个 dyno 都使用最近部署的文件系统的干净副本启动。

最佳做法不是将上传的文件存储到磁盘,而是 利用云文件存储服务,例如 Amazon 的 S3。


查看完整回答
反对 回复 2022-12-27
?
慕森王

TA贡献1777条经验 获得超3个赞

当您将文件上传到 Django 管理员时,它会查看DEFAULT_FILE_STORAGE设置配置以确定如何存储该文件。默认情况下,它使用django.core.files.storage.FileSystemStorage,这意味着它正在将那些上传的文件写入 dyno 文件系统中定义的位置MEDIA_ROOT

问题是,dynos 是短暂的,它们可以在没有任何警告的情况下被销毁、重新启动和移动,从而取代你的文件系统。这意味着那些上传的文件只是被删除得无影无踪,但ImageField引用仍然认为它们在那里。

此问题的解决方案是更新项目DEFAULT_FILE_STORAGE以使用永久性的东西,例如s3-compatible object store。在 Heroku 和 Django 领域,一个常见的解决方案是django-storagesHeroku 的 Bucketeer 附加组件一起使用。该解决方案将您的文件上传到持久性数据存储,该数据存储在 dyno 重新启动后仍然存在,而不是写入经常被删除的 dyno 文件系统。

我知道这可能会让人望而生畏,所以我写了这篇文章,其中很好地介绍了 Heroku + Bucketeer 流程。


查看完整回答
反对 回复 2022-12-27
  • 2 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信