1

Apache / phpの世界から来て、django開発のベストプラクティスを検索してもわからないことがあります:

symfony2 フレームワーク (または Java Play!) では、常に「パブリック」フォルダーがあり、Web サーバーはこのフォルダーのファイルのみを提供します。セキュリティ上の理由から、開発プロセス中に公開ファイルをこのフォルダーに配置することも明らかです。

django では、まったく明確ではありません。私の読みでは、ルート レベルに静的フォルダーと、UGC ファイル用の Media フォルダー、およびテンプレート フォルダーを用意することをお勧めします。メインの「パブリック」フォルダーはありません。

誰かがここで私の心をクリアにするのを手伝ってくれますか? 1 つのフォルダーにすべての要求を格納し、残りのアプリを保護する方が安全ではないでしょうか?

タンク

4

2 に答える 2

3

django には 2 種類の「静的」ファイルがあります。

  1. アプリケーションにバンドルされたリソース/アセット (通常は css、javascript)
  2. ユーザーがアップロードしたすべてのファイル。

これらは静的ファイルの 2 つの異なるカテゴリであるため、django はそれらを処理するための 2 つのメカニズムを提供します。最初の条件は 2 番目の条件よりも一般的であるため (ユーザーにファイルのアップロードを要求するアプリケーションがない可能性があります)、最初の条件の処理は django に組み込まれています。

標準のレイアウトに従って、静的ファイルを必要とするstaticアプリケーションは、アプリケーション ディレクトリ内で呼び出されるディレクトリにそれらを含めます。INSTALLED_APPSDjango は、静的ファイル用のアプリ内でこのディレクトリを検索します。どのアプリにも関連付けられていないファイルがある場合は、それらを別のディレクトリに配置できます。STATICFILES_DIRSdjango が認識できるように、このディレクトリを (タプル) に追加する必要があります。

これが完了すると、collectstaticコマンドはすべての静的ファイルを (static内のすべてのアプリケーションのサブディレクトリと 内INSTALLED_APPSの任意のディレクトリからSTATICFILES_DIRS) 収集し、それらをSTATIC_ROOT;が指すディレクトリに配置します。これは、{{ STATIC_URL }}タグがテンプレートで正しく機能するためです。

STATIC_ROOTあとは、Web からアクセスできるようにディレクトリを移動/ポイント/リンクするだけです。Django は、STATIC_ROOTで指定されたルート URL ですべてのファイルにアクセスできることを想定していますSTATIC_URL


ユーザーがアップロードしたファイルの場合、django はより手間がかかりません。本当に気にするのは、ユーザーがアップロードしたファイルを、collectstaticコマンドがファイルを読み取るために使用するのと同じ場所に置かないことです-つまり、MEDIA_ROOTディレクトリまたはサブディレクトリにすることはできませんSTATICFILE_DIRS(ディレクトリを指定した場合)ここでは、通常、この設定はバニラ django セットアップでは定義されていません)。

MEDIA_ROOTは、ルートの下にサブディレクトリを作成することで django が操作できるディレクトリです (たとえば、FileFieldドキュメントを参照してください)。

MEDIA_URLユーザーがアップロードしたファイルのルートを指す URL プレフィックスです。これは、モデルの自動 URL を生成するコマンドが正しく機能するようにするためです。


これらは 2 つの異なるクラスの静的ファイルであるため、セキュリティと展開の要件には 2 つの異なるタイプがあります。たとえば、ユーザーがアップロードしたファイルを S3 バケットに保存し、アプリケーションのアセットを別の場所に置きたい場合があります。

これが、これら 2 つの類似したものが django で分離されている理由です。

于 2012-11-25T09:25:43.143 に答える
0

コマンドを使用して、すべての静的アセットを public/static フォルダーにコピーできます。

> python manage.py collectstatic

manage.py に静的パスを設定している場合

STATIC_ROOT = "~/mypath/public/static/"

各アプリには独自の静的アセットが必要です。

于 2012-11-25T09:14:52.077 に答える