Django + Heroku:图像工作直到下一次推送

时间:2017-01-11 02:13:34

标签: python django heroku static gunicorn

我有一个基本的学习博客应用程序,我遇到了一个问题:"博客文章"通过应用程序的管理表单上传的图像工作正常,直到我通过heroku推送另一个版本。然后,图像显示破坏的img图标,即使图片目标在我看图片地址时app也无法找到图像。

我觉得我错过了一些对某些事情至关重要的东西 - 因此我无法通过谷歌解决这个问题。有谁知道为什么我在这里绊倒,我甚至接近这个吗?

我使用Django + Gunicorn + dj-static来提供静态文件。

以下是模型:

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    picture = models.ImageField(upload_to='blog/static/blog/images')
    section = models.ForeignKey('Section')
    posted = models.DateTimeField(auto_now_add=True)
    posted_by = models.TextField()
    tags = models.ManyToManyField('Tag')
    def __str__(self):
        return self.title

观点:

def detail(request, post_id):
    post = Post.objects.get(id=post_id)
    picture = post.picture
    context = {'post': post, 'picture': picture}
    return render(request, 'blog/detail.html', context)

包含图片html的剪辑:

<hr>
   <img src="{{ picture.url }}">
<hr>

settings.py处理静态文件:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/

STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'

BOOTSTRAP3 = {'include_jquery': True}

LOGIN_URL = '/users/login'

MEDIA_ROOT = 'media'
MEDIA_URL = '/media/'

#Herokusettings
if os.getcwd() == '/app':
    import dj_database_url
    DATABASES = {
        'default' : dj_database_url.config(default='postgres://localhost')
    }

    DEBUG = False

    SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

    ALLOWED_HOSTS = ['*']

    PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoprojectcom/en/1.9/howto/static-files/
    STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
    STATIC_URL = '/static/'

    MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
    MEDIA_URL = '/media/'

    # Extra places for collectstatic to find static files.
    STATICFILES_DIRS = (
        os.path.join(PROJECT_ROOT, 'static'),
    )

和wsgi.py:

import os

from django.core.wsgi import get_wsgi_application
from dj_static import Cling, MediaCling

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "bss.settings")
application = Cling(get_wsgi_application())
application = Cling(MediaCling(get_wsgi_application()))

#application = get_wsgi_application()

感谢您给我一看,我觉得我错过了一切关于这一切是如何运作的基本信息。

1 个答案:

答案 0 :(得分:0)

Heroku上的默认上传位置是临时存储。这是因为每次部署时都会得到一个不同的Web工作者。

您需要使用S3或其他位置来存储文件。幸运的是,这是Heroku上Paperclip的详细记录。