Как заставить Django обслуживать статические файлы с помощью Gunicorn?
Я хочу запустить проект django под пулеметом на локальном хосте. Я установил и интегрировал стрельбу. Когда я запускаю:
python manage.py run_gunicorn
Он работает, но нет никаких статических файлов (css и js)
Я отключил debug и template_debug в settings.py(сделал их ложными), но он все тот же. Я что-то пропустил?
Я вызываю статику как:
{{ STATIC_URL }}css/etc....
Ответы
Ответ 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