91

ローカルホストのgunicornでdjangoプロジェクトを実行したいと思います。gunicornをインストールして統合しました。私が走るとき:

python manage.py run_gunicorn

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

settings.pyでdebugとtemplate_debugを無効にしました(falseにしました)が、それでも同じです。私は何かが足りないのですか?

私は静力学を次のように呼びます:

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

7 に答える 7

194

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

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

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

urlpatterns += staticfiles_urlpatterns()

詳細はこちら

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

こちらをご覧ください

于 2012-10-09T13:27:09.723 に答える
35

白色雑音

v4.0以降

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

DjangoのWSGI統合オプション(wsgi.pyの編集を含む)は削除されました。代わりに、settings.pyのミドルウェアリストにWhiteNoiseを追加し、wsgi.pyからWhiteNoiseへの参照を削除する必要があります。詳細については、ドキュメントを参照してください。(純粋な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)

Django1.9でテスト済み。

于 2016-05-13T22:39:52.277 に答える
21

gunicornは、Pythonの「アプリケーション」自体を提供するために使用する必要がありますが、静的ファイルは静的ファイルサーバー(Nginxなど)によって提供されます。

これは私の構成の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を設定したら、プロジェクトルートで「pythonmanage.py collectstatic」を実行して、さまざまなアプリの静的ファイルを静的フォルダーにコピーできるようにする必要があります。

最後に:gunicornから静的ファイルを提供することは可能ですが(デバッグのみの静的ファイル提供ビューを有効にすることで)、これは本番環境では悪い習慣と見なされます。

于 2012-10-09T13:26:12.917 に答える
16

私はこれを私の開発環境(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の回答と同様に機能しますが、静的ファイルを実行する場合はミドルウェアを実行しません。

于 2017-09-21T19:53:35.930 に答える
6

Jamie Hewlandが言うように、静的ファイルを提供するために、通常はNginxを使用してすべてのリクエストを/static/にルーティングします

location /statis/ {

    alias /path/to/static/files;

}

Nginx + Gunicorn + Django

言い換えれば、そしてcoreywardがGunicorn/Unicornについて言うように

クライアントへのファイルの提供に関連する一連の問題を解決するようには設計されていません

Gunicornの代わりにuWSGIのような他のWSGIサーバーを検討する場合も、同じ考え方が当てはまります。uWSGIドキュメント

uWSGIを介して静的ファイルを提供するのは非効率的です。代わりに、Nginxから直接サービスを提供し、uWSGIを完全にバイパスします


より簡単な方法は、セットアップが非常に簡単なWhiteNoiseライブラリを使用してPythonで静的ファイルを提供することです(ほとんどのリクエストがPythonアプリに到達しないようにCDNを使用することをお勧めします)。ミゲル・デ・マトスが言うように、あなたはただしなければなりません

  1. 静的を収集する

     python manage.py collectstatic
    
  2. ホワイトノイズのインストール

     pip install whitenoise
    
  3. STATICFILES_STORAGEsettings.pyに以下を追加します

     STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    
  4. あなたのsettings.pyに以下を追加MIDDLEWAREします(mracetteのメモとして、「whitenoiseのドキュメントによると、ミドルウェアは後に配置する必要がありますdjango.middleware.security.SecurityMiddleware」)

     `MIDDLEWARE = [
       'django.middleware.security.SecurityMiddleware',
       'whitenoise.middleware.WhiteNoiseMiddleware',
       ...
     ]
    
于 2020-06-05T09:16:37.597 に答える
1

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

于 2018-02-26T16:17:14.387 に答える
0

Apache / Gunicornを使用している場合は、これが私の設定方法です。

  1. Djangoのルートディレクトリ(とmanage.py)で、dirを作成しますmkdir -p django_static/static

  2. プロジェクトsettings.pyで次のように設定します。

DEBUG = False
INSTALLED_APPS = [..., 'django.contrib.staticfiles', ...]
STATIC_URL = 'static/'
STATIC_ROOT = os.path.join(BASE_DIR, "django_static", "static")
  1. を実行しますpython manage.py collectstatic。これにより、静的コンテンツがに出力されますdjango_static/static

  2. (およびオプション)gunicornでサーバーを起動しますgunicorn your_project_name.wsgi

  3. /var/wwwデフォルトのグローバルApache設定があると仮定すると、静的ディレクトリへ のソフトリンクを作成する必要があります。sudo ln -s /path/to/your_django_project/django_static /var/www/your_django_project_static

  4. www.example.comDjangoアプリをポイントするドメインについて、ルートhttps://www.example.com127.0.0.1:8000 除くwww.example.com/static/すべてのリクエストをプロキシするために、Apacheで次の仮想ホストを構成します(この場合、からのそのようなリクエストにファイルを提供しますdjango_static)。

<VirtualHost *:443>
    ServerName www.example.com
    DocumentRoot /var/www/your_django_project_static
    <Location "/">
        ProxyPreserveHost On
        ProxyPass http://127.0.0.1:8000/
        ProxyPassReverse http://127.0.0.1:8000/
    </Location>
    <Location "/static/">
        ProxyPass "!"
    </Location>
</VirtualHost>

出来上がり!

于 2022-02-16T17:23:09.267 に答える