django heroku 媒体文件 404 错误
Posted
技术标签:
【中文标题】django heroku 媒体文件 404 错误【英文标题】:django heroku media files 404 error 【发布时间】:2013-09-05 21:19:16 【问题描述】:我最近向 Heroku 部署了一个 Django 应用程序并上传了一些媒体文件,一切似乎都运行良好,直到昨天我再次尝试访问该应用程序并看到它给出了 404 错误。
任何想法为什么会发生这种情况?
settings.py:
import os
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
import dj_database_url
#DATABASES['default'] = dj_database_url.config()
DATABASES = 'default': dj_database_url.config(default='postgres://localhost')
# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Allow all host headers
ALLOWED_HOSTS = ['*']
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'
urls.py
urlpatterns = patterns('',
(r'', include(application.urls)),
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/', include(admin.site.urls)),
(r'^media/(?P<path>.*)$', 'django.views.static.serve','document_root': settings.MEDIA_ROOT),
(r'^static/(?P<path>.*)$', 'django.views.static.serve','document_root': settings.STATIC_ROOT),
)
【问题讨论】:
你能不能给我更多的细节,比如 application.urls 也可以在你点击 url 时分享 heroku 日志 也不确定这是否适合 heroku 'postgres://localhost' @dusual 我正在使用 django-oscar,所以我真的无法“快速”访问它。关于 postgres,这是我让 django 应用程序在 heroku 上工作的唯一方法。我认为这与图像更改位置或其他东西有关 【参考方案1】:Heroku dyno 的使用寿命有限,当它们死亡并被替换(自动发生)时,其中的任何文件都会丢失,包括您通过 Django 上传的任何文件。您要做的是设置 Django 的媒体处理以将文件放在更永久的位置(这也将允许您一次使用多个 dyno,这就是 Heroku 处理水平缩放的方式)。我倾向于为此使用 Amazon S3,所以我的配置看起来有点像:
AWS_STORAGE_BUCKET_NAME = "your_bucket"
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
MEDIA_URL = "https://%s.s3.amazonaws.com/" % os.environ['AWS_STORAGE_BUCKET_NAME']
MEDIA_ROOT = ''
AWS_ACCESS_KEY_ID = "your_access_key_id"
AWS_SECRET_ACCESS_KEY = "your_secret_access_key"
这是使用 django-storages
和 boto 提供使用 Amazon S3 的 Django 存储层。
请注意,根据您的应用程序,S3 的这种“直通”访问可能不合适。 Heroku 的开发中心中有 some notes on working with S3 可能会有所帮助。
【讨论】:
感谢您的回答:)。有免费的存储服务吗? amazon s3 收费对吗? S3 是付费的(尽管这对我来说几乎从来都不是一笔可观的费用)。不知道是否有免费的替代方案——您可以查看django-storages
中提供的其他后端,看看是否有比 S3 更适合您的。
我在您的配置中遇到了一些问题,但这帮助我解决了问题,还整理了我的静态和上传文件***.com/questions/10390244/…
由于某种原因,即使我把所有东西都放在亚马逊上,也会发生同样的行为。它工作了一段时间,但我第二次尝试重新加载页面 e 给了我一个 404。我确实注意到链接是不同的(他们现在有 ../cache/... )......有什么想法吗?
您是否在使用类似 sorl 的工具进行缩略图?这将生成缓存版本。我怀疑,如果不了解更多关于您的配置的信息,真的很难提供帮助。【参考方案2】:
我的猜测是你的静态文件有问题。
例如,你有
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
对于我的 Heroku 应用,我有
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
静态文件的设置似乎很少有人真正理解(包括我自己),但这篇博文提供了一个很好的解释:http://blog.doismellburning.co.uk/2012/06/25/django-and-static-files/
【讨论】:
但我遇到了媒体文件问题,而不是静态文件。此问题仅适用于我从管理面板上传的照片...我相信它不相关,对吧?以上是关于django heroku 媒体文件 404 错误的主要内容,如果未能解决你的问题,请参考以下文章
Django React -- Heroku 上的部署错误(找不到页面 404)
部署到 heroku 时出现错误“无法加载资源 404”bundle.js
Heroku jQuery JavaScript 库未加载 - 404 错误
在 Heroku 服务器上部署 Django 错误 (500) - 据说是静态文件问题