Не в состоянии ссылаться на статические файлы проекта Django от Heroku - PullRequest
0 голосов
/ 29 мая 2018

Я не могу загрузить статические файлы в производство, в то время как они работают на локальной машине.

Я выполнил шаги, описанные в https://devcenter.heroku.com/articles/django-assets, а также существующие ответы, но не смог его запустить.Я что-то упускаю из виду и хотел бы получить помощь сообщества.

Вот частичное settings.py:

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

ALLOWED_HOSTS = ['tryml.herokuapp.com','localhost']


# Application definition

INSTALLED_APPS = [
    'web.apps.WebConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    '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',
]

ROOT_URLCONF = 'tryml.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 = 'tryml.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.0/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/2.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

import dj_database_url
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

Вот wsgi.py file:

import os

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tryml.settings")

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

Вот HTML-файл, пытающийся получить доступ к статическому содержимому:

{% extends "web/base.html" %}
{% load static %}

{% block content %}

      <div>
        <img src="{% static 'web/img/target.jpg' %}" alt="Image could not be loaded"></img>
      </div>

{% endblock %}

Вот структура проекта:

tryml
  --static
    --web
      --img
        --target.jpg
  --tryml
    --settings.py
    --wsgi.py
    --urls.py 
  --web(web app)
  --(urls,forms,templates,...)
  --manage.py
  --Procfile
  --requirements.txt
  --runtime.txt

Oneбольше наблюдения, когда я проверяю запросы, отправленные из моего браузера, он показывает ошибку 404 для статического файла (изображения) и говорит, что пытался найти здесь- ... herokuapp.com/static/web/img/target.jpg

Разве это не должно ссылаться на STATIC_ROOT (staticfiles / web / img / target)?

EDIT-- Команда collectstatic запускается, когда код помещается на heroku, и показывает успешный шаг копирования.в приложение / статические файлы.Тем не менее, статический файл не загружается .

EDIT2 - я выполнил команду python manage.py findstatic web / img / target.jpg, как упомянуто здесь: https://docs.djangoproject.com/en/2.0/ref/contrib/staticfiles/#findstatic

Он вернул расположение файла на локальной машине, но на heroku,он говорит: «Не найдено подходящего файла для web / img / target.jpg».Почему он не находится даже после успешного выполнения команды collectstatic?Как на самом деле работает производственная загрузка статических файлов?Когда я использую {% static web / img / target.jpg%}, идет ли он в местоположение STATIC_ROOT, чтобы получить его?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

После выполнения команды 'find' на удаленном сервере heroku со своего компьютера я узнал, что файл хранится как 'target.JPG', а не 'target.jpg'.

Я изменил ссылку доступа в шаблоне, и это сработало.

На локальной машине CAPS, кажется, не имеют значения, так как я уже играл с ними ранее.

Кроме того, мой git push to heroku действительно никогда не менял имя файла на 'target.jpg', потому что он не учитывает изменения заглавных букв имени файла, если не указано иное, как упомянуто здесь - Изменение заглавной буквыимена файлов в Git

Спасибо.

0 голосов
/ 29 мая 2018

Вы должны обслуживать статический файл, используя nginx, или вы должны добавить путь в URL-адресах py.

urlpatterns = [
            # ... the rest of your URLconf goes here ...
 ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...