programing tip

Django가 Gunicorn으로 정적 파일을 제공하도록 만드는 방법은 무엇입니까?

itbloger 2021. 1. 5. 07:48
반응형

Django가 Gunicorn으로 정적 파일을 제공하도록 만드는 방법은 무엇입니까?


localhost의 gunicorn에서 django 프로젝트를 실행하고 싶습니다. gunicorn을 설치하고 통합했습니다. 내가 실행할 때 :

python manage.py run_gunicorn

작동하지만 정적 파일 (css 및 js)이 없습니다.

settings.py에서 debug 및 template_debug를 비활성화했지만 (거짓으로 설정) 여전히 동일합니다. 내가 뭔가를 놓치고 있습니까?

나는 통계를 다음과 같이 부른다.

{{ STATIC_URL }}css/etc....

시에서 개발 모드 때 로컬 개발을위한 다른 서버를 사용 하여 url.py이 추가

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

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

urlpatterns += staticfiles_urlpatterns()

여기에 더 많은 정보

프로덕션 에서 절대 gunicorn을 앞에 두지 마십시오. 대신 gunicorn 작업자 풀에 요청을 전달하고 정적 파일도 제공하는 nginx와 같은 서버를 사용합니다.

여기를 참조 하십시오


화이트 노이즈

v4.0 이후

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

Django 용 WSGI 통합 옵션 (wsgi.py 편집 포함)이 제거되었습니다. 대신 settings.py의 미들웨어 목록에 WhiteNoise를 추가하고 wsgi.py에서 WhiteNoise에 대한 모든 참조를 제거해야합니다. 자세한 내용은 설명서를 참조하십시오. (순수한 WSGI 통합은 장고가 아닌 앱에서도 계속 사용할 수 있습니다.)

v4.0 이전

Heroku는 https://devcenter.heroku.com/articles/django-assets 에서이 방법을 권장합니다 .

이제 애플리케이션은 프로덕션에서 Gunicorn에서 직접 정적 자산을 제공합니다. 이것은 대부분의 애플리케이션에 완벽하게 적합하지만 최상위 애플리케이션은 Django-Storages와 함께 CDN을 사용하여 탐색 할 수 있습니다.

다음으로 설치 :

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에서 테스트되었습니다.


gunicorn은 파이썬 "애플리케이션"자체를 제공하는 데 사용해야하며 정적 파일은 정적 파일 서버 (예 : 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;
        }
    }
}

몇 가지 참고 사항 :

  • 정적 루트, 미디어 루트, 정적 파일 경로 접두사 및 미디어 파일 경로 접두사는 settings.py에서 설정됩니다.
  • 정적 콘텐츠 디렉토리에서 제공하도록 nginx를 설정 한 후에는 다양한 앱의 정적 파일을 정적 폴더에 복사 할 수 있도록 프로젝트 루트에서 "python manage.py collectstatic"을 실행해야합니다.

마지막으로, gunicorn에서 정적 파일을 제공 할 수 있지만 (디버그 전용 정적 파일 제공보기를 사용 설정하여) 이는 프로덕션에서 나쁜 관행으로 간주됩니다.


I've used this for my development environment (which uses 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()

And then run gunicorn myapp.wsgi. This works similar to @rantanplan's answer, however, it does not run any middleware when running static files.


Since Django 1.3 there is django/conf/urls/static.py that handle static files in the DEBUG mode:

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)

Read more https://docs.djangoproject.com/en/2.0/howto/static-files/#serving-static-files-during-development

ReferenceURL : https://stackoverflow.com/questions/12800862/how-to-make-django-serve-static-files-with-gunicorn

반응형