Статичні файли Django 404


79

Я не можу отримати свої статичні файли. Я пробував різні налаштування, конфігурації каталогів і так далі, але вони виявляються як 404s. У мене встановлено 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">

Будь-які ідеї? Дякую


7
Чому мені потрібно запускати collestatic, якщо я вручну створив статичну папку? Я все одно це зробив, але все одно не вийшло. Django не розпізнає мою статичну папку, незважаючи на налаштування.
KindOfGuy

40
Спробуйте: python manage.py findstatic --verbosity 2 css/styles.cssпобачити, де Django шукає ваші статичні файли.
deed02392

4
@ deed02392 Я знаю, що це пройшло довгий час пізніше, але ДЯКУЮ, я не міг з'ясувати, чому мій не працює. Скільки б я не намагався змінити STATIC_URLсвої налаштування, це не спрацювало. Тоді ця команда допоможе мені знайти місцезнаходження, я не знаю, чому це не зміниться
Amon

1
Радий, що це допомогло @Amon, це була ключова команда, яка допомогла мені зрозуміти, що теж відбувається
deed02392

Відповіді:


126

Це робоче рішення для доступу до статичного / медіа / шаблону в django для Windows,

settings.py

import os.path

STATIC_ROOT = ''

STATIC_URL = '/static/'

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

4
Дякую, чудово! За додатковою інформацією ви можете слідкувати за blog.xjtian.com/post/52685286308/… цим блогом, дуже практичним описом того, як обслуговувати статику в django.
Хрещений батько

10
os.path.join('static')дає просто'static'
Славомір Ленарт

Це допомогло і мені. Щоб точніше визначити проблему в моєму випадку, у моєму рядку join () у мене було провідне "/".
Метью Вебер

STATIC_ROOTспецифікація не потрібна. І, як зазначив @ SławomirLenart, ви можете позбутися joinі просто використовувати рядок.
cirrusio

3
@cirrusio STATIC_ROOT - це власне те, що мені потрібно. Я дотримувався підручника і не міг завантажити статичні файли. Я просто додав рядок STATIC_ROOT = '', і він почав працювати. Мені не потрібні були інші зміни.
Джеффрі Гармон,

49

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


2
Чувак. Після годинних спроб це вирішило проблему. ПОДЯКА
М.Б.

ДЯКУЮ ++ Я божеволів.
NiKo 05.03.20

Це! Велике спасибі, майже збожеволіла, налагоджуючи мої статичні файли ...
jpdus

yyyuuup. що працював на робочому сервері, але один із моїх розробників мав проблеми з локальним сервером запуску на Windows .. виявляється, налагодження потрібно активувати локально :-) дякую! :-)
CeDeROM

21

Якщо ви запускаєте це на веб-сервері, чи копіюєте статичні файли у загальнодоступну папку? Наприклад:

# 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 і скопіювати статичний файл у загальнодоступну папку за допомогою 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

Сподіваюся, це допоможе!


Чи навмисно відрізняються URI? ( wwwпроти website)?
Ріккі

@Rikki так, щоб показати, що ви можете додати додаткові каталоги статичних файлів. Django об’єднає всі файли в цих каталогах і скопіює вSTATIC_ROOT
eodgooch

8

з коментарів вище - запустіть це

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

Не знайдено відповідного файлу для 'css / styles.css'.

Шукаємо в таких місцях:
/ Users / yourname / Documents / Workspace / test / staticfiles

Я просто перейменував свою статичну папку в staticfiles і все було добре. (Я на osx + django 1.x)

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

python manage.py runserver --insecure

ОНОВЛЕННЯ

насправді копаючись у settings.py знайшов рядок, що порушує права.

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

7

Я просто додав еквівалент

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

щоб це працювало. Звичайно, замініть absolute_path_to_projectваш дійсний шлях і, якщо потрібно, додайте букву диска.


7

Якщо ви нещодавно змінили налагодження на false у файлі налаштувань. Дотримуйтесь цієї процедури.

Велику частину часу це спричиняється помилковим налаштуванням налагодження в settings.py. Якщо ви передасте перемикач --insecure серверу запуску, він повинен працювати. Тож якщо ви все-таки python manage.py runserver 0.0.0.0:8000зміните його наpython manage.py runserver 0.0.0.0:8000 --insecure замість цього.

Це має спрацювати.


2
Після читання документів, які я беру, django буде обслуговувати статику з увімкненим режимом dev. З іншого боку, для вимкненого режиму dev вам слід дійсно використовувати nginx, оскільки обслуговування статики за допомогою django неефективне. Прапор вище означає, що ви визнаєте цей факт.
Адам

6

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

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

в /etc/httpd/conf/httpd.conf , він працює належним чином зараз.

Якщо жодна з наведених відповідей не працює, ви можете перевірити конфігурацію сервера.


1
Мені було встановлено псевдонім, Alias /static/ /var/my/site/static як це є на docs.djangoproject.com/en/1.11/howto/deployment/wsgi/modwsgi/… , і змінивши перший дзвінок, щоб /staticвирішити проблему для мене. Дякую!
andrewec



2

Я припускаю, що ви використовуєте тут 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">

1
Привіт, я використовую {{STATIC_URL}}. Це було трохи незрозуміло, html, який я показав, був відтвореним файлом, щоб продемонструвати, що тег працює. Я працюю локально, тому я вважав, що потрібен лише параметр STATIC_URL, поки каталог / static був на місці.
KindOfGuy

2

у Django у вас є ще одна перевага для ваших шаблонів, і це те, що ви можете пов’язувати такі статики, і, можливо, це ваша проблема!

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

його краще використовувати

{% статичне 'ім'я файлу'%}

а також простіше дізнатися більше про це, я посилаюся на https://docs.djangoproject.com/en/1.11/intro/tutorial06/



1

у моєму випадку мої статичні файли знаходяться в 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' %}">

цей спосіб спрацював для мене.


0

Я думаю, ви пропустили додаток 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. У мене були проблеми з командами, і я таким чином це виправив.


0

на Cpanel це хороше рішення тут

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

pip install dj-static static3

тоді у wsgi.py замініть цей додаток py py

from dj_static import Cling

application = Cling(get_wsgi_application())

0

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

Мій каталог файлів проекту Django (Розпізнавання /) виглядає так:

/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
    ...

Мої настройки.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')

Мій (Розпізнавання / 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

0

для мене я не роблю нічого, крім запуску manage.py runserver myip: port. Потім я вимикаю його та перезапускаю uwsgi, статичні файли успішно завантажуються. Не знаю чому, але мені це вдається ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.