问题描述
我使用 Dokku 在服务器上部署了我的 Django 应用程序。 Staticfiles 似乎可以正常工作,因为 CSS 在管理仪表板中非常好,我可以上传文件,但无法访问该文件。
我发现无论如何我都应该使用 Dokku 持久性存储。所以我设置了它(我想)。然后我设置了我的 Nginx。在 Nginx 之前,Django 显示文件路径的“页面未找到”。现在,我收到“您要查找的页面不存在。”。
如何将我的应用正确连接到持久性存储?
编辑:
我手动将文件添加到 /var/lib/dokku/data/storage/dokkuappname
并且能够下载。所以 Nginx 正在工作,但 Django 没有使用存储文件夹作为媒体文件夹。
Django 上的静态和媒体设置
# STATIC
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#static-root
STATIC_ROOT = str(ROOT_DIR / "staticfiles")
# https://docs.djangoproject.com/en/dev/ref/settings/#static-url
STATIC_URL = "/static/"
# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_Dirs
STATICFILES_Dirs = [str(APPS_DIR / "static")]
# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders
STATICFILES_FINDERS = [
"django.contrib.staticfiles.finders.FileSystemFinder","django.contrib.staticfiles.finders.AppDirectoriesFinder",]
# MEDIA
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#media-root
MEDIA_ROOT = str(APPS_DIR / "media")
# https://docs.djangoproject.com/en/dev/ref/settings/#media-url
MEDIA_URL = "/media/"
Nginx media.conf 设置
location /media/ {
alias /var/lib/dokku/data/storage/dokkuappname/;
}
dokku storage:list dokkuappname result
dokkuappname volume bind-mounts:
/var/lib/dokku/data/storage/dokkuappname:/media
解决方法
解决方案
我想查看 Django 媒体文件夹的路径。我将 print(MEDIA_ROOT)
放入 base.py
以在部署期间打印路径。是/app/my_app_dir/media
。我意识到 /app
存在于 Dokku 文档中,但我一直认为它是像 path/to/app
这样的占位符。不,是路径。
Dokku 挂载示例
dokku storage:mount app-name /var/lib/dokku/data/storage/node-js-app:/app/storage
我修复了我的挂载命令:
dokku storage:mount my_app/var/lib/dokku/data/storage/my_app:/app/my_app_dir/media
终于成功了!