我最近向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}),
)
答案 0 :(得分:6)
Heroku dynos寿命有限,当它们死亡并被替换(自动发生)时,其中的任何文件都将丢失,包括您通过Django上传的任何文件。你想要做的是设置Django的媒体处理,使文件更加永久(这也允许你一次使用多个dynos,这就是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的devcenter中有some notes on working with S3可能有帮助。
答案 1 :(得分:0)
我的猜测是你的静态文件已经关闭了。
例如,你有
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/