Статические файлы с сайта работают, но не из приложения - PullRequest
0 голосов
/ 28 июня 2018

Некоторая путаница в отношении статических файлов (Python 3.6 Django 2 .. IIS 8.5) Мои статические файлы с сайта найдены, но статические файлы из приложения не найдены.

GET http://127.0.0.1:81/static/css/pyapp.css 404 (Not Found)

<link rel="stylesheet" type="text/css" href="{% static 'css/pyapp.css' %}">

Я пытался добавить

STATICFILES_DIRS =[(os.path.join(BASE_DIR, 'pyapp/static')),]"<

в settings.py, но не помогло.

Нужно ли добавлять web.config также в статическое приложение, как в статической папке сайта?

├───pyapp
│   ├───migrations
│   │   └───__pycache__
│   ├───static
│   │   └───css
|   │   │   └───pyapp.css   <=== this is not found
│   ├───templates
│   │   └───pyapp
|   │   │   └───my.html  <=== this works
│   └───__pycache__
└───pyweb
    ├───static           <=== this works
    │   └───admin
    │   ......
    └───__pycache__

Для конфигурации IIS я использовал этот учебник: http://blog.mattwoodward.com/2016/07/running-django-application-on-windows.html

settings.py

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '...'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

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

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',
]

ROOT_URLCONF = 'pyweb.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 = 'pyweb.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 = 'de-ch'

TIME_ZONE = 'Europe/Berlin'

USE_I18N = True

USE_L10N = True

USE_TZ = True


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

STATICFILES_FINDERS = (
  'django.contrib.staticfiles.finders.FileSystemFinder',
  'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS =[(os.path.join(BASE_DIR, 'pyapp/static')),]

Структура проекта

Ответы [ 5 ]

0 голосов
/ 28 июня 2018

просто измените STATIC_ROOT = os.path.join(BASE_DIR, 'static') в настройках STATIC_ROOT = '/static/' с этим поиском django в каждом установленном приложении. Статические каталоги их в вашем шаблоне используют <link rel="stylesheet" type="text/css" href="{% static 'css/pyapp.css' %}">

также вы можете проверить с помощью команды django ./manage.py findstatic 'css/pyapp.css' она возвращает путь к этому файлу, если существует

также вы можете прочитать о статических файлах здесь - django staticfiles

0 голосов
/ 28 июня 2018

Я нашел проблему. Спасибо за помощь!

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

sites
├───pyweb
|    └───pyapp
|    └───pyweb
|    └───static
|    |    └───admin
|    |    └───pyapp   <=== this was not visible in IIS, refreshing not enough!

Это ошибка или я должен это знать?

0 голосов
/ 28 июня 2018

Вам не нужно включать ваш каталог pyapp/static в STATICFILES_DIRS. AppDirectoriesFinder найдет его, пока pyapp находится в INSTALLED_APPS.

Однако вы должны включить pyweb/static (при условии, что pyweb не в INSTALLED_APPS).

STATICFILES_DIRS =[(os.path.join(BASE_DIR, 'pyweb/static')),]

Вы можете удалить STATICFILES_FINDERS, чтобы упростить настройки, так как вы используете значение по умолчанию.

Затем вам нужно запустить manage.py collectstatic, чтобы убедиться, что pyapp/static и pyweb/static собраны в вашем статическом корне.

Если в вашем каталоге pyweb/static есть какие-либо статические файлы, которые были там собраны (ваш вопрос выше предполагает, что, возможно, в нем есть статические файлы из приложения администратора), то вы можете удалить их. Каталог pyweb/static должен содержать только те файлы, которые находятся под контролем версий. Статические файлы из других приложений / каталогов должны быть собраны в статический корень.

Наконец, вам нужно настроить IIS для сервера вашей статической корневой папки. Я не знаком с IIS, но похоже, что вы используете web.config для этого.

Если ваши статические файлы находятся в pyapp/static/pyapp вместо pyapp/static/, то вам придется настроить тег static, включив в него префикс pyapp:

{% static 'pyapp/css/pyapp.css' %}"
0 голосов
/ 28 июня 2018

Нет необходимости использовать STATICFILES_DIRS, потому что вы уже используете ROOT, и я тоже не использую STATICFILES_FINDERS

Настроить так

INSTALLED_APPS = (
    ...
    'django.contrib.staticfiles',
    ...
    )


STATIC_URL = '/static/'
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

Obs .: Вы должны установить путь, как сказал Ojas Kale

Перезагрузите сервер, и статические данные должны быть доступны на локальном хосте: 8000 / static / pyapp / css / pyapp.css (или любой IP-адрес или порт, который вы установили)

0 голосов
/ 28 июня 2018

Всегда имейте свою структуру каталогов как это.

pyweb
|______static
|      |_______pyweb
       |         |______css  
                 |

Затем запустите python manage.py collectstatic

Я нашел Настройка статических файлов всегда сложно

...