Подтвердить что ты не робот

Как заставить Django обслуживать статические файлы с помощью Gunicorn?

Я хочу запустить проект django под пулеметом на локальном хосте. Я установил и интегрировал стрельбу. Когда я запускаю:

python manage.py run_gunicorn

Он работает, но нет никаких статических файлов (css и js)

Я отключил debug и template_debug в settings.py(сделал их ложными), но он все тот же. Я что-то пропустил?

Я вызываю статику как:

{{ STATIC_URL }}css/etc....
4b9b3361

Ответ 1

В режиме разработки и когда вы используете какой-либо другой сервер для локальной разработки, добавьте его в свой url.py

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

# ... the rest of your URLconf goes here ...

urlpatterns += staticfiles_urlpatterns()

Подробнее здесь

Когда в production вы никогда, никогда не ставили перед собой пушки. Вместо этого вы используете сервер, такой как nginx, который отправляет запросы в пул рабочих-артиллеристов, а также обслуживает статические файлы.

Смотрите здесь

Ответ 2

Белый шум

Пост v4.0

http://whitenoise.evans.io/en/stable/changelog.html#v4-0

Опция интеграции WSGI для Django (которая включала редактирование wsgi.py) была удалена. Вместо этого вы должны добавить WhiteNoise в свой список промежуточного программного обеспечения в settings.py и удалить любую ссылку на WhiteNoise из wsgi.py. Смотрите документацию для более подробной информации. (Чистая интеграция WSGI по-прежнему доступна для приложений, не относящихся к Django.)

До v4.0

Heroku рекомендует этот метод по адресу: https://devcenter.heroku.com/articles/django-assets:

Ваша заявка теперь будет обслуживать статические активы непосредственно из Gunicorn в производстве. Это будет вполне адекватно для большинства приложений, но приложениям верхнего уровня может потребоваться использовать CDN с Django-Storages.

Установить с помощью:

pip install whitenoise
pip freeze > requirements.txt

wsgi.py:

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

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "free_books.settings")
application = get_wsgi_application()
application = DjangoWhiteNoise(application)

Проверено на Django 1.9.

Ответ 3

Буксирн должен использоваться для обслуживания самого приложения "python", а статические файлы обслуживаются статическим файловым сервером (например, Nginx).

Здесь есть хорошее руководство: http://honza.ca/2011/05/deploying-django-with-nginx-and-gunicorn

Это выдержка из одной из моих конфигураций:

upstream app_server_djangoapp {
    server localhost:8000 fail_timeout=0;
}

server {
    listen < server port goes here >;
    server_name < server name goes here >;

    access_log  /var/log/nginx/guni-access.log;
    error_log  /var/log/nginx/guni-error.log info;

    keepalive_timeout 5;

    root < application root directory goes here >;

    location /static {    
        autoindex on;    
        alias < static folder directory goes here >;    
    }

    location /media {
       autoindex on;
       alias < user uploaded media file directory goes here >;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://app_server_djangoapp;
            break;
        }
    }
}

Некоторые примечания:

  • В ваших настройках настроены статический корень, корень носителя, префикс пути статических файлов и префикс пути файла мультимедиа.
  • Как только у вас установлен nginx для работы из каталога статического содержимого, вам нужно запустить "python manage.py collectstatic" в корне вашего проекта, чтобы статические файлы в различных приложениях можно было скопировать в статическую папку

В завершение: пока можно использовать статические файлы из gunicorn (путем включения режима просмотра статических файлов только для отладки), это считается плохой практикой в ​​производстве.

Ответ 4

Я использовал это для своей среды разработки (которая использует gunicorn):

from django.conf import settings
from django.contrib.staticfiles.handlers import StaticFilesHandler
from django.core.wsgi import get_wsgi_application


if settings.DEBUG:
    application = StaticFilesHandler(get_wsgi_application())
else:
    application = get_wsgi_application()

Затем запустите gunicorn myapp.wsgi. Это похоже на ответ @rantanplan, однако при запуске статических файлов он не запускает никакого промежуточного программного обеспечения.

Ответ 5

Начиная с Django 1.3 существует django/conf/urls/static.py, который обрабатывает статические файлы в режиме отладки:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Прочитайте больше https://docs.djangoproject.com/en/2.0/howto/static-files/#serving-static-files-during-development