Django выдает ошибку 500 для всех c файлов stati, таких как CSS и изображений, если DEBUG имеет значение False - PullRequest
1 голос
/ 05 мая 2020

Я пробовал разные решения, уже опубликованные пользователями, но у меня они не работали.

settings.py Project

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG = False
ALLOWED_HOSTS = ["*"]

STATIC_URL = '/static/'
STATICFILES_DIRS=[

    os.path.join(BASE_DIR,'static')
]
STATIC_ROOT=os.path.join(BASE_DIR,'assets')

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

Все Мои файлы CSS находятся в папке стилей внутри папки stati c. И все изображения находятся в папке мультимедиа.

Журналы консоли браузера

        Refused to apply style from 'http://127.0.0.1:8000/static/styles/LandingPage_CSS.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.
        icons8-user-48.png:1 
    Failed to load resource: the server responded with a status of 500 (Internal Server Error)
        Doorakart%20icon.png:1 Failed to load resource: the server responded with a status of 500 (Internal Server Error)
        apple.jpg:1 
    Failed to load resource: the server responded with a status of 500 (Internal Server Error)
        banana.jpg:1 
    Failed to load resource: the server responded with a status of 500 (Internal Server Error)
        watermelon.jpg:1 
    .
    .
    .

    Failed to load resource: the server responded with a status of 500 (Internal Server Error)
    Refused to apply style from 'http://127.0.0.1:8000/static/styles/LandingPage_CSS.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.

Пример HTML файл

{% load static %}
<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <title></title>

    <link rel="stylesheet" href="{% static 'styles/LandingPage_CSS.css' %}">
</head>

   ...
      # IMAGES ARE LOADED LIKE THIS
     <img src="media/{{item.itemImage}}" alt="img" class=" card-img-top">

   ...

Кроме того, я хочу отключить DEBUG, потому что я хочу создать свою собственную страницу ошибки 404. Страница 404 также будет содержать stati c Image и CSS, возможно ли это? Пожалуйста, помогите мне и с этим.

1 Ответ

1 голос
/ 05 мая 2020

Это ожидаемое поведение . Django не не обслуживает stati c файлы или мультимедийные файлы в производстве. Вы должны настроить nginx, и т.д. c. для обслуживания файлов.

Как указано в Stati c представление разработки файла раздел документации :

Это представление будет работать, только если DEBUG равно True.

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

Обычно вы должны настроить nginx, apache веб-сервер для обслуживания stati c файлы. Эти веб-серверы, вероятно, более эффективны и имеют более специализированные инструменты для обеспечения безопасности.

Django предлагает некоторые инструменты, которые помогут вам настроить файлы stati c, например, с помощью collectstatic команда [Django -doc] для сбора stati c файлов в одном месте. В документации также описывается, как создать конфигурацию basi c для apache и nginx.

Также имеется package whitenoise, если вы действительно хотите разрешить Django обслуживать файлы stati c в производстве, но как сказано в документации :

Разве не обслуживает файлы stati c из Python ужасно неэффективно?

Короткий ответ на этот вопрос: если вы заботитесь о производительности и эффективности, тогда вы должно быть с использованием WhiteNoise за CDN , например CloudFront. Если вы это сделаете, то из-за заголовков кеширования, которые отправляет WhiteNoise, подавляющее большинство запросов stati c будет обслуживаться непосредственно CDN, не затрагивая ваше приложение, поэтому на самом деле не имеет большого значения, насколько эффективен WhiteNoise. .

Тем не менее, WhiteNoise довольно эффективен. Поскольку он должен обслуживать только фиксированный набор файлов, он выполняет всю работу по поиску файлов и определению правильных заголовков заранее при инициализации. Затем запросы могут обслуживаться с помощью немногим более простого поиска в словаре, чтобы найти подходящий ответ. Кроме того, при использовании с gunicorn (и большинством других серверов WSGI) фактическое продвижение файла по сетевому интерфейсу выполняется очень эффективным системным вызовом sendfile ядра, а не Python.

...