python - Python-Django-Heroku 无法在 heroku 中找到图像,图像不可见
问题描述
所以我最近将我的 django/python 网站(使用 sqllite 作为数据库)部署到了 heroku,它免费托管网站,一切都正常运行,就像我以前在浏览器中运行 localhost 时一样,除了这个项目使用 postgressql 数据库和 heroku并且图像没有出现在我的网站上,我到处查看,我认为这与数据库中的上传文件有关(图像的路径仍然相同,但图像的位置发生了变化)。
本地主机图片链接:“http://localhost:8000/image/download/uploads/products/white_shirt_MERETfT.jpg” heroku 图片链接:“https://supremelebanon.herokuapp.com/image/download/uploads/products/offwhite_shirt_tQWa19c .jpg”它说当我在heroku主机上加载网站时找不到图像。请任何人我仍然是heroku的新手,我真的不知道它是如何工作的,如果有人可以提供帮助,将不胜感激,在此先感谢。设置.py 文件:
import os
from pathlib import Path
import django_heroku
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'morrr7ht4t4m)j#%ws34ntr7mdq$pui)+uy2-#%tx^iznh_##6'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['supremelebanon.herokuapp.com', 'localhost', '127.0.0.1']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'store',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
# 'store.middlewares.auth.auth_middleware'
]
ROOT_URLCONF = 'supremelebanon.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'supremelebanon.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = "/image/download/"
MEDIA_ROOT = BASE_DIR
# Activate Django-Heroku.
django_heroku.settings(locals())
index.html 中的图像部分:
{% extends 'base.html' %}
{% block content %}
{% load cart %}
{% load custom_filter %}
{{customer}}
{% if request.session.customer %}
<!-- body -->
<div class="container-fluid mt-3">
<div class="row">
<!--filter-->
<div class="col-lg-3 mx-auto">
<div class="list-group">
<a href="/" class="list-group-item list-group-item-action ">All Products</a> <!-- GOTTA DO A DROPDOWN -->
{% for category in categories %}
<a href="/?category={{category.id}}" class="list-group-item list-group-item-action ">{{category.name}}</a>
{% endfor %}
</div>
</div>
<!-- all products -->
<div id='products' class="col-lg-9 mx-auto">
<div class="row mx-auto">
{% for product in products %}
<div class="card mx-auto mb-3" id="{{product.id}}" style="width: 18rem;">
<img class="card-img-top" src="{{product.image.url}}" alt="Card image cap">
解决方案
你可以试试这个settings.py,在测试之前你可以与你的代码进行比较并查看差异
import os
from pathlib import Path
import django_heroku
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'morrr7ht4t4m)j#%ws34ntr7mdq$pui)+uy2-#%tx^iznh_##6'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['supremelebanon.herokuapp.com', 'localhost', '127.0.0.1']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'store',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
# 'store.middlewares.auth.auth_middleware'
]
ROOT_URLCONF = 'supremelebanon.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'supremelebanon.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
try:
from projectname.local_settings.py import DATABASES
except:
import dj_database_url
import dotenv
DATABASES = {}
DATABASES['default'] = dj_database_url.config()
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
SECURE_SSL_REDIRECT = True # [1]
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = "/image/download/"
MEDIA_ROOT = BASE_DIR
# Activate Django-Heroku.
#django_heroku.settings(locals())
对于您的 local_settings.py 是:
import os
from projectname.settings import BASE_DIR
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
简要说明
我们必须添加允许您在生产中提供文件的白噪声,如果您注意到,heroku 在生产中使用 postgres 作为数据库,因此最好将其用于生产。
推荐阅读
- javascript - 电话号码验证正则表达式
- c# - Quartz C# 每小时运行一次
- python - 没有名为“pynput”的模块
- android - 无法解决 React-native 中的 TransformError
- java - Spring注入XML未编组实体
- javascript - Electron:带有表单的对话框消息框
- json - 甲骨文 PLSQL 11g;将大型 JSON 对象存储为 CLOB(缓冲区在 122k 字符时太小)
- swift - 如何快速过滤具有多个键的nsdictionary?
- javascript - 当一个部分使用 Vanilla JS 触及视口顶部时,如何触发函数?
- python - python:从索引中提取子矩阵