我有一个基本的学习博客应用程序,我遇到了一个问题:"博客文章"通过应用程序的管理表单上传的图像工作正常,直到我通过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()
感谢您给我一看,我觉得我错过了一切关于这一切是如何运作的基本信息。
答案 0 :(得分:0)
Heroku上的默认上传位置是临时存储。这是因为每次部署时都会得到一个不同的Web工作者。
您需要使用S3或其他位置来存储文件。幸运的是,这是Heroku上Paperclip的详细记录。