2012-06-10 18 views
5

私は最初の適切なwebdevプロジェクトを試しています。私はdjangoフレームワークを学んでいます。Djangoの静的ファイルとsettings.pyのファイルパス

ここでは、外部CSSのように「静的ファイル」を使用する最もクリーンな方法について質問しました.HTMLテンプレートの1つで言及しています。私はofficial documentation on the subjectを読んでみましたが、少し初心者として混乱していましたが、私はグーグルで試しましたが、ほとんどのガイドやstackoverflowの回答が少し違っていることに気付きました。尋ねるにはちょっとしたことがありますが、誰かが私にプロセスを説明して要約できますか?

参考のため、私のプロジェクトフォルダの階層を以下に示します。現時点では私はCSS/base.cssでsylesheetを使用するテンプレートbase.htmlを取得しようとしている: またenter image description here

私を投げ続けているものの一つが、絶対ファイルパスを使用することです。これまでは相対ファイルパスを使用するだけで済むようになりました。これは目的がDjangoテストサーバー上で開発し、それを自分のサーバーに転送することです。 (注:おそらく、それは、転送プロセスがどれほど複雑で、私は絶対ファイルパスが好きなのか分からないからです)。相対ファイルパスを使用する際の問題点は何ですか?

これはルールに反する2つの質問になることを認識していますが、私は本当に両方が一緒に答えられると思います。もし私が1つ理解すれば、もう一方の理解を助けるでしょう。どんな助けでも大歓迎です。

答えて

2

静的ファイルにstaticfilesdocs)を使用できるように、Django 1.3以上を使用していると仮定します。各Djangoのウェブサイトは、ウェブサイトの特定の部分に必要なすべてのファイル(つまり、models.pyviews.pytemplatesディレクトリ、さらにstaticディレクトリ)を含む複数のアプリケーション(ディレクトリ)で構成されています。このstaticディレクトリには、JavaScriptファイルとCSSファイル(およびそのアプリ用の他の静的ファイル)が含まれています。

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

だからあなたのWebプロジェクトの一般的な構造は次のようになります。

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

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

staticfilesのドキュメントを読む価値があります。このプロジェクトレイアウトでは、他のプロジェクトでDjangoアプリケーションを簡単に再利用できるためです。

  • ブログ/ models.py
  • ブログ/テンプレート/ブログ/ overview.htmlに
  • ブログ/テンプレート/ブログ/ post.html
  • :たとえば、あなたはこのように見えるウェブサイトを想像することができます
  • ブログ/ views.py
  • 写真/ models.py
  • 写真/テンプレート/写真/ overview.htmlに
  • フォー
  • ブログ/ urls.py TOS /テンプレート/写真/ photo.html
  • 写真/ urls.py
  • 写真/ views.py
  • 静的
  • manage.py
  • settings.py
  • urls.py

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

+0

静的なディレクトリに「CSS/bootstrap.min.css」にアクセスする方法を示す例である非常にありがとうコードのモジュール化とデプロイメントプロセスの説明について、非常に良い点を挙げるのと同じです。残念ながら私はばかだと私は自分の練習のプロジェクトを正しく設定する方法を見つけることがまだできませんでしたが、私はここに新しい、より具体的な質問を開くことにしました:http://stackoverflow.com/questions/ 11033571/django-virtual-serverを使って静的ファイルを使用する – Holly

+0

これはforemanコマンドとどのように機能しますか?私は上司を使うようになってから、静的な資産はローカルにロードされませんでしたが、うまく機能しています...しかし、配備されてもうまくいきます...シメオンからのこの回答は、静的なファイルを扱うプロセス - しかし、私はforeman対liveインスタンスを使用するときにいくつかのより明確な期待をしていた...今私の管理者は、警備員に見えるときにCSSがありません....任意のアイデア? – tbarbe

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と入力してデプロイすると、これは静的ファイルを見つけるためにウェブサーバを設定したパスに過ぎません。その後、manage.py collectstaticを実行すると、そのディレクトリにコピーされます。それはSTATIC_ROOTの唯一の機能だと思います。

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

だから私のプロジェクト構造は次のように次のようになります。相対パスでの問題は、彼らがあなたのURLスキームが変更された場合、変更する必要がありますということです

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

オプション:絶対的なファイルシステムのパスを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'), 
) 

これは、静的ファイルを見つける場所を開発サーバーに指示します。テンプレートに対しても同じことができますし、完全なファイルパスを使用することもできます。

+1

あなたの設定はモジュラーではありませんが、あなたの情報も正しいです。理想的には、すべての静的ファイルとテンプレートファイルは、アプリ内のディレクトリに存在する必要があります(ルートテンプレートディレクトリに配置する必要がある404.htmlや500.htmlなどの例外はほんの僅かです)。ローカルで開発する場合、 'STATIC_ROOT'ディレクトリは空でなければなりません。プロダクションサーバ上にファイルがあるだけです。 –

4

からのコードスニペットがあります。静的ファイルを含むために変更されました drchronoプロジェクトのDjango設定。 sqlite3のデータベースは必要な保存されているSITE_ROOTディレクトリ

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

絶対アドレスここ

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

番目

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


STATIC_ROOT = SITE_ROOT 
STATIC_URL = '/static/' 

店舗静的ファイルの

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

動的に設定する変数電子テンプレートはテンプレートで今

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

) 

を格納している

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

を使用し、これは

関連する問題