Джанго Статические файлы 404

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

Структура каталогов, показывающая / static (я также разместил каталог внутри папки с приложениями пищи и пользователями, просто чтобы попробовать.

/mealmate
    /mealmate
    /meals
    /static
        /css
             /bootstrap.min.css
    /templates
    /users

Settings.py (несколько важных настроек, хотя я экспериментировал с множеством других):

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

STATIC_URL = '/static/'

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

WSGI_APPLICATION = 'mealmate.wsgi.application'

В base.html визуализируется

    <link rel="stylesheet" href="/static/css/bootstrap.min.css">

Есть идеи? Спасибо

28 ответов

Это рабочее решение для статического / медиа / доступа к шаблону в Django для Windows,

settings.py

import os.path

STATIC_ROOT = ''

STATIC_URL = '/static/'

STATICFILES_DIRS = ( os.path.join('static'), )

Для меня это, как оказалось, вызвано установкой отладки в false в settings.py, Обходной путь должен пройти --insecure переключиться на runserver, но реальным решением является использование подходящего веб-сервера для обслуживания статических файлов. Смотрите ответы на этот вопрос для более подробной информации.

Если вы запускаете это на веб-сервере, копируете ли вы статические файлы в общедоступную папку? Например:

# web accessible folder
STATIC_ROOT = '/home/your_name/www/mealmate/static/'

# URL prefix for static files.
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
    # location of your application, should not be public web accessible 
    '/home/your_name/website/mealmate/static',
)

# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)

Затем вы можете использовать этот пост Django static Files и скопировать статические файлы в общедоступную папку, используя manage.py

# --link    Create a symbolic link to each file instead of copying.
# --noinput Do NOT prompt the user for input of any kind.
#
python manage.py collectstatic -link --noinput

Надеюсь, это поможет!

Из комментариев выше - запустите это

python manage.py findstatic --verbosity 2 css/styles.css

Не найдено подходящего файла для 'css/styles.css'.

Глядя в следующих местах:
/ Пользователи / ВашеИмя / Документы /Workspace/ тест / staticfiles

Я просто переименовал свою статическую папку в staticfiles, и все было хорошо. (Я на OSX + Django 1.x)

Использование небезопасного режима может не повредить, если вы находитесь на локальном устройстве разработки - в противном случае вы все равно можете получить 404 ошибки.

python manage.py runserver --insecure

ОБНОВИТЬ

фактически копаясь в settings.py нашел нарушающую линию.

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'staticfiles'),
)

Если вы недавно изменили отладку на false в файле настроек. Следуйте этой процедуре.

В большинстве случаев это вызвано тем, что параметр отладки имеет значение false в settings.py. Если вы передадите параметр --insecure серверу выполнения, он должен работать. Итак, если вы это сделаетеpython manage.py runserver 0.0.0.0:8000 измените это на python manage.py runserver 0.0.0.0:8000 --insecure вместо.

Он должен работать.

Я просто добавил эквивалент

STATICFILES_DIRS = (
    '/absolute_path_to_project/mealmate/static',
)

чтобы это заработало. Конечно, заменить absolute_path_to_project с вашим реальным путем и, при необходимости, добавьте букву диска.

Я также застрял в проблеме 404, пока не понял, что Apache заблокировал запросы к статическому каталогу. я использовал python manage.py collectstatic скопировать все статические файлы в директорию static под моим корнем проекта, т.е. / var / my / site / static. С

Alias /static /var/my/site/static
<Directory /var/my/site/static>
        Require all granted
</Directory>

в /etc/httpd/conf/httpd.conf, теперь он работает правильно.

Если ни один из приведенных выше ответов не работает, вы можете рассмотреть возможность проверки конфигурации вашего сервера.

Если вы страдаете от этой ошибки, сначала проверьте, является ли отладка истинной или ложной, и используете ли вы вместе 'STATIC_ROOT' и 'STATICFILES_DIRS'

В моем случае я использовал в своем settings.py следующее:

      import os (You have to import os at first)



#(If the app is in production mode then False. By default True)

   DEBUG = False 

#(If debug is false then add allowed hosts)

   ALLOWED_HOSTS = ['*'] 

#(Built in)

   STATIC_URL = '/static/' 

   STATIC_ROOT = 'static' (You have to add it to the code)

   STATICFILES_DIRS = [ os.path.join(BASE_DIR, '/static') ] (You have to add it to the code)

В моем случае все, что мне нужно было сделать, это перезапустить сервер:

python manage.py runserver

Добавить ниже в setting.py

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

Я предполагаю, что вы используете Django1.3+ здесь.

Прежде всего, вам нужно определить еще несколько параметров:

STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

STATICFILES_DIRS = [
    path.join(TOP_DIR, 'static'),
]

STATIC_ROOT = path.join(TOP_DIR, 'staticfiles')
STATIC_URL = '/static/'

Это должно помочь вам найти этот каталог.

Кроме того, вы всегда должны обращаться к статическим файлам, используя STATIC URL:

<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css">

В Django у вас есть еще одно преимущество для ваших шаблонов, и вы можете связывать статические данные, как это, и, возможно, это ваша проблема!

<script src="{% static 'myapp/bootstrap.min.js' %}"></script>
<link href="{% static 'myapp/bootstrap.css' %}" rel="stylesheet" type="text/css"/>

лучше использовать

{% static 'filename' %}

и его также легче узнать больше, я обращаюсь к https://docs.djangoproject.com/en/1.11/intro/tutorial06/

Убедитесь, что ваш партнер по питанию находится в вашем INSTALLED_APPS

В моем случае мои статические файлы находятся в resources/static каталог, и я установил некоторые настройки, например settings.py файл:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, './resources/static/'),
)

и использую его в моем шаблоне следующим образом:

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

этот способ сработал для меня.

измените переменную DEBUG на True в настройках.

метод runserver ищет статику, только если включена отладка, в противном случае он будет искать в URL-адресе STATIC_ROOT

Вставьте многострочный код в файл settings.py в папке main проекта:

      STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join('static'))

В файл html вставить:

      {% load static %}

Добавлять django.contrib.staticfiles в INSTALLED_APPS = [...]

На локальном хосте обязательно определитеDEBUG = Trueнаsettings.py

В качестве современного решения попробуйте пакет Django Whitenoise . Его легко установить и легко использовать, если следовать инструкциям.

несколько упрощенных шагов:

  1. Собирать статические файлы – перед установкой убедитесь, что статические файлы существуют.

             python manage.py collectstatic
    
  2. Установите Whitenoise — этот шаг зависит от того, как вы управляли пакетами, обновите соответствующий файл (например, Pipfile или require.txt) и установите. Ниже представлена ​​команда для установки пакета.

             pip install whitenoise
    
  3. Обновите статический корень в settings.py.

             STATIC_ROOT = BASE_DIR / "staticfiles"
    
  4. Добавьте следующее в свойMIDDLEWAREв settings.py - из документации Whwitenoise пакет Whitenoise должен располагаться послеdjango.middleware.security.SecurityMiddleware

             `MIDDLEWARE = [
       'django.middleware.security.SecurityMiddleware',
       'whitenoise.middleware.WhiteNoiseMiddleware', #add it here exactly after security middleware
       ...
     ]
    
  5. теперь перезапустите или пересоберите приложение, чтобы проверить, работает ли оно у вас.

Пожалуйста, проверьте документацию Whitenoise, если у вас возникли проблемы с установкой Whitenoise ( документация Whitenoise ).

сообщение об использованииstaticfiles_urlpatterns: это работает только тогда, когда DEBUG=Trueв settings.pyэто означает, что вам НЕ следует использовать его в производственной среде. см. ссылку здесь

Для меня я ничего не делаю, кроме как запускаю manage.py runserver myip:port. Затем я выключаю его и перезапускаю uwsgi, статические файлы загружаются успешно. Не знаю почему, но у меня это работает...

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

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

Каталог файлов моего проекта Django (Recognition/) выглядит так:

/media
   /1
     i1.jpg
     i2.jpg
     ....

/static
    /css
       /op.css
    /img
       /emoji.png

/Recognition
    ...
    /settings.py
    /urls.py
    ...

/uploader
    ...
    /urls.py
    /templates
         /uploader
             /create.html
    ...

Мой файл settings.py выглядит так:

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

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Recognition',
    'uploader',
]

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

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

Мои (Recognition/urls.py) выглядят так:

urlpatterns = [
    path('admin/', admin.site.urls),
    ...
]
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Затем я получаю доступ ко всем статическим файлам и медиафайлам в шаблоне (create.html) следующим образом: Вот пример кода

<!DOCTYPE html>
<html>
<head>
   {% block extrahead %}
      <link rel="stylesheet" type="text/css" href="static/css/op.css">
   {% endblock %}
</head>

<style type="text/css">
.notfound .notfound-404 {
  ...
  background-image: url('static/img/emoji.png');
  ...
}
<style>

<body>
  <img src="{{ MEDIA_ROOT }}/media/i1.jpg" class="image_responsive" height="100px" width="100px">
</body>

ИЛИ

Вы можете использовать эту команду django, чтобы узнать, где django видит ваши статические файлы. ИСТОЧНИК

python manage.py collectstatic --help

В джанго версии 4.1.2STATIC_ROOTне работает, вместо этого используйтеSTATICFILES_DIRS = [ BASE_DIR / "static" ]

как говорят документы Джанго ; добавление этого кода просто устранило мою проблему.

      STATICFILES_DIRS = [
    BASE_DIR / "static",
]

Я смог решить эту же проблему, изменив имя файла js с корпуса camel на случай змеи.

Похоже, вы неправильно загружаете статические файлы в свой шаблон. Правильный способ сделать это,

Для Джанго 1.6 или более ранней версии

      {% load staticfiles %}
<link rel="stylesheet" type="text/css" href="{% static "css/bootstrap.min.css" %}">

Для Джанго с 1.7 по 2.1

      {% load static %}
<link rel="stylesheet" type="text/css" href="{% static "css/bootstrap.min.css" %}">

Для Джанго 2.2 или новее

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

ПРИМЕЧАНИЕ. Убедитесь, что для параметра DEBUG установлено значение False , чтобы он загружался правильно.

На Cpanel это хорошее решение здесь

на терминале на cpanel установить dj-static static3

pip install dj-static static3

затем в wsgi.py замените это приложение на код py

from dj_static import Cling

application = Cling(get_wsgi_application())

Я думаю, что вы пропустили, чтобы поместить приложение INSTALLED_APPS в ваш файл settings.py, вы должны добавить "поединок"

INSTALLED_APPS = (
    'mealmate',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

После этого статические и командные файлы будут видны django. У меня были проблемы с командами, и именно так я это исправил.

в моем случае это была проблема: корневой каталог был имя_проекта , но каталог приложения, в котором находится статическая папка, был my_app , поэтому django пытался найти статические файлы в имя_проекта /static, когда они были в имя_проекта / my_app /static, поэтому я обновил STATICFILES_DIRS = ('my_app/static/',)

я также добавил после определения STATICFILES_DIRS в settings.py:

      print('static paths are:')
for p in STATICFILES_DIRS:
    print(Path(p).resolve())

чтобы узнать, какое место было правильным, чтобы я мог получить вывод этой команды при запуске этой команды:

      python manage.py findstatic --verbosity 3 css/main.css
Другие вопросы по тегам