10

私のDjango1.3プロジェクトは、開発サーバーで静的ファイルを提供しますが、gunicornサーバーでは静的ファイルは提供されません。このHerokuガイドの手順に従いました。

ガイド()のようにprocfileの内容を使用すると web: gunicorn myproject_django.wsgi -b 0.0.0.0:$PORT、プロジェクトがHerokuに認識されませんでした。

次に、そのProcfileを次のように変更しました。

web: python myproject_django/manage.py run_gunicorn -b 0.0.0.0:$PORT -w 3

これで、静的ファイル(cssがアクティブでも画像でもない)を除いてアプリが実行されます。

私のプロジェクトツリー:

.
├── Procfile
├── myproject_django
│   ├── core
│   │   ├── admin.py
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── static
│   │   │   ├── css
│   │   │   │   ├── base.css
│   │   │   │   ├── layout.css
│   │   │   │   
│   │   │   └── media
│   │   │       ├── pek.ico
│   │   │       ├── pek.png
│   │   │       ├── pek_symbol.png
│   │   ├── tests.py
│   │   └── views.py
│   ├── __init__.py
│   ├── manage.py
│   ├── settings.py
│   ├── templates
│   │   └── core
│   │       ├── home.html
│   │       └── install.html
│   └── urls.py
└── requirements.txt

settings.pyの潜在的に関連する部分

MEDIA_ROOT = ''

MEDIA_URL = '/static/media'

STATIC_ROOT = ''

STATIC_URL = '/static/'

ADMIN_MEDIA_PREFIX = '/static/admin/'

STATICFILES_DIRS = (
    os.path.abspath(__file__)+'/..'+'/myproject_django/core/static', 
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)


INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core',
    'gunicorn',
    'django.contrib.admin',
)

編集

Francis Yaconielloのエントリー後、次のことを調整しました。

settings.pyで

STATIC_ROOT = os.path.join(os.getcwd(),'core/static')
STATICFILES_DIRS = ( os.path.abspath(__file__)+'/..'+'/core/static', )

gitignoreの場合:

staticfiles/*

その後、コミットしました。そして最後に走っheroku run python myproject_django/manage.py collectstaticた。

しかし、Webページを確認しても、静的ファイルはまだ提供されていません。私のディレクトリツリーを考えると、なぜこれらの変更が機能しなかったのですか?

Edit2

静的ファイルがまだ表示されません。DEBUG=Trueこれを取得しているときに画像をクリックすると、次のようになります。

Request URL: http://myproject.herokuapp.com/static/media/pek.png

ツリーstaticfiles(ディレクトリが空であることに注意してください)

.
├── Procfile
├── myproject_django
│   ├── admin
│   ├── core
│   │   ├── admin.py
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── static
│   │   │   ├── css
│   │   │   │   ├── base.css
│   │   │   │   ├── layout.css
│   │   │   └── media
|   |   |       ├── pek.ico
|   │   │       ├── pek.png
|   │   │       ├── pek_symbol.png
│   │   ├── tests.py
│   │   ├── views.py
│   ├── __init__.py
│   ├── manage.py
│   ├── settings.py
│   ├── staticfiles
│   ├── templates
│   │   └── core
│   │       ├── 404.html
│   │       ├── 500.html
│   │       ├── home.html
│   │       └── install.html
│   ├── urls.py
└── requirements.txt

settings.pyで

PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'static/media')
STATIC_ROOT = os.path.join(PROJECT_PATH,'staticfiles')
STATICFILES_DIRS = (
    os.path.join(PROJECT_PATH, 'core/static'),
)
4

5 に答える 5

5

指定してくださいSTATIC_ROOT

私は通常、次のように設定します。

import os
STATIC_ROOT = os.path.join(os.getcwd(), "staticfiles")

プロジェクトにそのディレクトリを作成します

mkdir staticfiles

staticfiles の内容が git で追跡されていないことを確認してください

nano .gitignore

追加

staticfiles/*

それをコミットしてherokuにプッシュします。

最後に、

heroku run python manage.py collectstatic

編集

STATIC_ROOT = os.path.join(os.getcwd(),'core/static')
STATICFILES_DIRS = ( os.path.abspath(__file__)+'/..'+'/core/static', )

これら 2 つの設定を同じにすることはできません。

STATICFILES_DIR冗長な場合は、次のように各アプリSTATICFILES_FINDERSのディレクトリで静的ファイルを見つけるように既に指示している場合は、問題ありません。static'django.contrib.staticfiles.finders.AppDirectoriesFinder',

ポイントは、STATIC_ROOTnginx などのサードパーティ サーバーで提供できる、プロジェクトから完全に分離された新しいディレクトリを提供することです。そのディレクトリを作成した理由は次のstaticfilesとおりです。

STATIC_ROOT = os.path.join(os.getcwd(),'staticfiles')

別の編集

一時ファイルシステムの回避策

各 dyno は、最近デプロイされたコードの新しいコピーを含む独自の一時的なファイルシステムを取得します。dyno の存続期間中、実行中のプロセスはファイルシステムを一時的なスクラッチパッドとして使用できますが、書き込まれたファイルは他の dyno のプロセスからは見えず、書き込まれたファイルは dyno が停止または再起動された瞬間に破棄されます。

つまり、web の起動時に各 dyno インスタンスで static を収集する限り、問題は発生しません。

web: python myproject_django/manage.py collectstatic --noinput; python myproject_django/manage.py run_gunicorn -b 0.0.0.0:$PORT -w 3

そうは言っても、私は現在 S3 と django ストレージhttp://django-storages.readthedocs.org/en/latest/index.htmlを使用しています。これを実行するのはかなり簡単です(そして安価です)。

于 2012-08-16T19:34:08.390 に答える
4

There is one solution.

In urls.py add:

from django.conf import settings

urlpatterns += patterns('',
    (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
)

p.s. For STATIC_URL = '/static/'

于 2012-12-21T15:05:05.253 に答える
1

私は同じ問題に遭遇しました。特に次の 3 つの設定が必要なようです。

  1. STATIC_ROOTで定義する必要がありますsettings.py。たとえば、次のようになります。

    STATIC_ROOT = os.path.join(PROJECT_PATH, 'served/static/')
    

    プロジェクトルートはどこですかPROJECT_PATH(あなたの場合、myproject_djangoディレクトリへの絶対パス.

  2. 同様に、STATIC_URLも設定する必要があります (設定しないと、Django は ImproperlyConfigured エラーをスローします)。の現在の設定'/static/'は問題ありません。

  3. rooturls.pyで、静的 URL を構成します。

    from django.conf import settings
    from django.conf.urls.static import static  
    
    ...
    
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    

最後に、実行しpython manage.py collectstaticます。これにより、すべてのファイルが から/path/to/site-packages/django/contrib/admin/static/admin/にコピーされ/served/static/ます。(Django が静的ファイルを提供する方法の詳細については、こちらを参照してください)。

を実行するforeman startと、スタイリングされた管理者が表示されます。

!に追加することを忘れないserved/static/でください。.gitignore

于 2013-10-07T21:44:39.527 に答える
1

heroku-django-cookbookが提供するrun_collectstaticの一部として実行されるスクリプトを使用します。Heroku python buildpack が提供するフックを利用します。post_compilepost_compile

于 2013-03-18T12:31:06.430 に答える