web-dev-qa-db-ja.com

Django= Gunicornで静的ファイルを提供するには?

Djangoプロジェクトをlocalhostのgunicornで実行したい。gunicornをインストールして統合した。実行すると:

python manage.py run_gunicorn

動作しますが、静的ファイル(cssおよびjs)はありません

Settings.pyでdebugとtemplate_debugを無効にしました(falseにしました)が、それでも同じです。何か不足していますか?

私は次のような静的関数を呼び出します:

{{ STATIC_URL }}css/etc....
52
alix

developmentモードで、ローカル開発に他のサーバーを使用している場合これをURLに追加します.py

from Django.contrib.staticfiles.urls import staticfiles_urlpatterns

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

urlpatterns += staticfiles_urlpatterns()

詳細 こちら

productionにいるときは、決してgunicornを前面に配置することはありません。代わりに、リクエストをgunicornワーカーのプールにディスパッチし、静的ファイルも提供するnginxのようなサーバーを使用します。

こちら をご覧ください

138
rantanplan

ホワイトノイズ

Post v4.0

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

Django(wsgi.pyの編集を伴う)のWSGI統合オプションは削除されました。代わりに、settings.pyのミドルウェアリストにWhiteNoiseを追加し、wsgiからWhiteNoiseへの参照を削除する必要があります。 py。詳細については、ドキュメントを参照してください(純粋なWSGI統合は、Django以外のアプリでも引き続き使用できます)。

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はpython "application"自体を提供するために使用する必要がありますが、静的ファイルは静的ファイルサーバー(Nginxなど)によって提供されます。

ここに良いガイドがあります: http://honza.ca/2011/05/deploying-Django-with-nginx-and-gunicorn

これは私の構成の1つからの抜粋です。

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から静的ファイルを提供することは可能ですが(デバッグ専用の静的ファイル提供ビューを有効にすることで)、それは実稼働環境では悪い習慣と見なされます。

12
Ngure Nyaga

開発環境(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を実行します。これはsimilar@ rantanplan's answer で動作しますが、静的ファイルを実行しているときはミドルウェアを実行しません。

5
WhyNotHugo

Django 1.3以降、DEBUGモードで静的ファイルを処理する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

1
frost-nzcr4