django heroku媒体文件404错误

django heroku媒体文件404错误,django,heroku,http-status-code-404,Django,Heroku,Http Status Code 404,我最近在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 = {'

我最近在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/'
url.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}),

)
urlpatterns=patterns(“”,
(r“”,包括(application.url)),
url(r“^admin/doc/”,包括('django.contrib.admindocs.url'),
url(r“^admin/”,包括(admin.site.url)),
(r“^media/(?P.*)”、“django.views.static.service”、{“document\u root”:settings.media\u root}),
(r'^static/(?P.*)','django.views.static.service',{'document\u root':settings.static\u root}),
)

我猜您的静态文件有问题

例如,你有

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
对于我的Heroku应用程序,我有

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

静态文件的设置似乎很少有人真正理解(包括我自己),但这篇博文提供了一个很好的解释:

Heroku dynos的寿命有限,当它们死亡并被替换(自动发生)时,其中的任何文件都会丢失,包括您通过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"
这是使用和来提供一个使用AmazonS3的Django存储层


请注意,S3的这种“直通”访问可能不合适,具体取决于您的应用程序。Heroku的devcenter中有一些可能会有所帮助。

那么,你能给我更多的细节,比如application.url吗?当你点击URL时,你能分享Heroku的日志吗?我也不确定这是否适合Heroku的应用程序postgres://localhost“@dusual我正在使用django oscar,所以我真的无法“快速”访问它。关于博士后,这是我让django应用程序在heroku上运行的唯一方法。我认为这与图像改变位置或其他事情有关,但我对媒体文件有问题,而不是静态文件。这个问题只适用于我从管理面板上传的照片。。。我相信这没有关系,对吧?谢谢你的回答:)。有免费的存储服务吗?AmazonS3是付费的吗?s3是付费的(尽管对我来说,这几乎从来都不是一笔可观的成本)。不知道是否有免费的替代方案-您可以查看
django storages
中提供的其他后端,看看是否有比S3更适合您的后端。我遇到了一些配置问题,但这帮助我解决了这个问题,也组织了我的静态文件和上传的文件。出于某种原因,即使我把所有东西都放在亚马逊上,同样的行为也会发生。它工作了一段时间,但是当我第二次尝试重新加载页面时,e给了我一个404。我注意到链接是不同的(它们现在有../cache/…)。。有什么想法吗?你是不是用sorl之类的东西来做拇指钉?这将生成缓存版本。我想,如果不了解更多有关配置的信息,就很难提供帮助。