5

私は最初の適切なwebdevプロジェクトを試していて、djangoフレームワークを学んでいます。

私はここに来て、HTMLテンプレートの1つで参照している外部CSSのように、「静的ファイル」を使用する最もクリーンな方法について質問しました。このテーマに関する公式ドキュメントを読んでみましたが、初心者としては少し混乱しました。次にグーグルを試してみましたが、ガイドやスタックオーバーフローの回答のほとんどがわずかに異なることに気付き、理解を深める必要があることに気付きました。少し生意気な質問ですが、誰かが私にプロセスを説明して要約することができますか?

参考までに、これが私のプロジェクトフォルダ階層です。現時点ではbase.html、次の場所でスタイルシートを使用するためのテンプレートを取得しようとしていCSS/base.cssます。 ここに画像の説明を入力してください

また、私を失望させ続けるものの1つは、絶対ファイルパスの使用です。これまでのところ、相対ファイルパスを使用するだけでうまくいくことができました。これは、djangoテストサーバーで開発し、サーバーがある場合はすべてを自分のサーバーに転送することを目的としているため、より理にかなっています。(注:おそらく、転送プロセスがどれほど複雑であるかわからないため、絶対ファイルパスが優先される理由がわかりません)。相対ファイルパスの使用に関する問題は何ですか?

これはルールに反する2つの質問になっていると思いますが、両方を一緒に答えることができ、一方を理解すれば、おそらくもう一方を理解するのに役立つと思います。どんな助けでも大歓迎です。

4

3 に答える 3

5

これは、静的ファイルを含めるために変更したsettings.pyのコードスニペットのセットです。

import os
import django
DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__))
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))

SITE_ROOTディレクトリの変数を動的に設定する

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3', 
            'NAME': os.path.join(SITE_ROOT,'data.db'),                      

sqlite3データベースが保存されている場所には絶対アドレスが必要です

            'USER': '',
            'PASSWORD': '',
            'HOST': '',                     
            'PORT': '',                     
        }
    }


STATIC_ROOT = SITE_ROOT
STATIC_URL = '/static/'

ここに静的ファイルを保存します

STATICFILES_DIRS = (
    os.path.join(SITE_ROOT,'static'),
       )

テンプレートが保存される場所

TEMPLATE_DIRS = (
    os.path.join(SITE_ROOT,'templates'),

)

今テンプレートで使用

 {% load static %} --at beginning
<link href="{% static "css/bootstrap.min.css"%}" rel="stylesheet" media="screen">

これは、静的ディレクトリの「 css/bootstrap.min.css 」にアクセスする方法を示す例です。

于 2013-07-22T04:17:52.443 に答える
2

Django 1.3以降を使用していると仮定します。これにより、静的ファイルにstaticfilesdocs )を使用できるようになります。基本的な考え方は次のとおりです。各DjangoWebサイトは、Webサイトの特定の部分(つまり、、、ディレクトリ、およびディレクトリ)に必要なすべてのファイルを含む複数のアプリ(ディレクトリ)で構成されmodels.pyviews.pytemplatesますstatic。このstaticディレクトリには、JavaScriptファイルとCSSファイル(およびそのアプリの他の静的ファイル)が含まれています。

Webサイトを展開するときは、コマンドを実行してcollectstaticすべての静的ファイルを1つのディレクトリに収集します。次に、そのディレクトリから、サイトの訪問者に静的ファイルを提供します(つまり、Apacheまたは別のWebサーバーがそれを実行できます)。

したがって、Webプロジェクトの一般的な構造は次のようになります。

  • manage.py
  • ウェブサイト/models.py
  • website / views.py
  • website / static / website / css / base.css
  • website / static / website / js / base.js
  • ウェブサイト/テンプレート/ウェブサイト/base.html
  • 静的
  • settings.py
  • urls.py

staticDjangoアプリの名前がとディレクトリのサブディレクトリで繰り返されていることに気付くでしょうtemplatesstaticこれが必要なのは、ファイルが一般ディレクトリに移動されたときにファイルを分離しておくためです。上記の例では、STATIC_ROOTは最上位staticディレクトリであり、このディレクトリにすべての静的ファイルがコピーされます。

staticfilesこのプロジェクトレイアウトを使用すると、他のプロジェクトでDjangoアプリを簡単に再利用できるため、のドキュメントを読むことは間違いなく価値があります。たとえば、次のようなWebサイトを想像できます。

  • blog / models.py
  • blog / templates / blog / overview.html
  • blog / templates / blog / post.html
  • blog / urls.py
  • blog / views.py
  • photos / models.py
  • photos /テンプレート/photos/overview.html
  • photos / templates / photos / photo.html
  • photos / urls.py
  • photos / views.py
  • manage.py
  • 静的
  • settings.py
  • urls.py

アプリはblogphotos必要に応じて他のWebサイトで簡単に再利用できるようになりました。

于 2012-06-10T16:33:12.883 に答える
1

@Simeon Visserの回答に時間を割いていただき、本当に感謝しています。そこには本当に役立つ情報がいくつかありましたが、それは私が探していたものではありませんでした。だから私は周りに尋ねて、redditからsinister_user_nameを持ってこれに感謝しました。これは他の誰かを助けるかもしれないと思いました:


最近のリリースでは静的ファイルがかなり変更されているため、古いブログは少し混乱している可能性があります。

私はそれにショットを与えます:

テンプレートではstatic_urlタグを使用でき、djangoがパスを入力します。

<link rel="stylesheet" href="{{ STATIC_URL }}css/bootstrap.min.css">

設定ファイルを見て静的URLを入力します。STATIC_URLデフォルト/static/は設定で思いますか?静的ファイルが企業のWebサーバーで奇妙なURLになってしまった場合は、とにかく設定で変更するだけで、すべてのテンプレートに反映されます。したがって、それらが絶対的であるかどうかは関係ありません。

デプロイに行くときSTATIC_ROOTは、設定を入力します。これは、静的ファイルを見つけるためにWebサーバーを設定したパスにすぎません。次に、実行するmanage.py collectstaticと、それらがそのディレクトリにコピーされます。STATIC_ROOTそれが私が思う唯一の機能です。

テンプレートディレクトリを静的ディレクトリから分離します。これは主に、テンプレートがPythonによって処理されている間、Webサーバーが静的ファイルを提供することだけを目的としているためです。したがって、静的ファイルは、Webサーバーがそれらを表示する限り、ほとんどアプリケーションの一部ではありません。テンプレートと静的ファイルは、主に両方ともPythonソースファイルではないため、ベースディレクトリ内の別々のパスに保持します。

したがって、私のプロジェクト構造は次のようになります。

manage.py
website/settings.py
app/models.py
app/views.py
templates/base.html
static/js/jquery.js
static/css/bootstrap.css

相対パスの問題は、URLスキームが変更された場合に変更する必要があることです。

オプション:このブログで、絶対ファイルシステムパスをsettings.pyに入れないようにするのに役立ちます。これは、職場と自宅など、複数のマシンで作業する場合に適しています:( 1.4のレイアウトが少し異なるため、これを上部で使用します。私の設定:

import os
import django
import manage

DJANGO_ROOT = os.path.dirname(os.path.realpath(django.__file__))
SITE_ROOT = os.path.dirname(os.path.realpath(manage.__file__))

彼らが提案するものの代わりに(設定の場所は1.4または1.3で移動しました)、SITE_ROOT混乱しています。私はそれがうまくいくかもしれないと思います。さらに下の設定で私はこれを使用します:

# Additional locations of static files
STATICFILES_DIRS = (
    os.path.join(SITE_ROOT, 'static'),
)

これにより、静的ファイルの場所が開発サーバーに通知されます。テンプレートについても同じことができますが、ファイルのフルパスを使用することもできます。

于 2012-06-11T18:07:13.650 に答える