2011-03-31 9 views
6

私はDjangoを初めて使ってプロジェクトを開始しました。私は正しい方法でそれをしたいと思います。Djangoプロジェクト階層/組織

私はあなたがプロジェクトを組織するためのベストプラクティスであると考えていることを知りたいと思います。ここで

は、私が持っているいくつかの質問です:私はジャンゴを通じて、静的なコンテンツを処理する時間を無駄にしないように

  • は、どのように私はPythonコードから静的リソースを分離していますか?
  • アプリは再利用可能なモジュールなので、プロジェクトにはあまりにも厳しいものではないので、それらはプロジェクトディレクトリに置かれるべきですか、自分の「自家製」アプリをすべて含む別のディレクトリに配置する必要がありますか?
  • テンプレートは静的コンテンツまたは動的コンテンツと見なされますか?ここで

私の現在のファイル階層です:あなたは

webapps/ 
    myproject/ 
     apache/ 
     bin/ 
     lib/ 
     templates/ 
      app1/ 
      app2/ 
     src/ 
      app1/ 
      app2/ 
      __init.py 
      settings.py 
      urls.py 
      manage.py 
     myproject.wsgi 
    admin/ 
    static/ 
     css/ 
     img/ 

どう思いますか? 何が良いでしょうか?

ありがとうございます!

答えて

5

あなたのディレクトリ構造は、使用しているdjangoのバージョンによって異なる場合があります。 django 1.3を使用している場合は、静的コンテンツの処理がわずかに変更されています。あなたのテンプレートは別々に配置することもできます。

以下はdjango 1.3にのみ適用されます。新しいdjango.contrib.staticfilesアプリケーションを使用する場合は

... 
app1/ 
    static/ 
     app1/ 
    templates/ 
     app1/ 
    models.py 
    ... 
    views.py 

は、あなたの設定は次のようになります。:appディレクトリ内

同様

MEDIA_ROOT = path.join(ROOT_PATH,'uploaded_media/') 
MEDIA_URL = '/uploaded_media/' 
# static content is collected here, and served from here, but don't add stuff manually here! add to staticfiles_dirs 
STATIC_ROOT = path.join(ROOT_PATH, 'collected_static/') 
ADMIN_MEDIA_PREFIX = '/static/admin/' 
STATIC_URL = '/static/' 
# Additional locations of static files 
STATICFILES_DIRS = (
    path.join(ROOT_PATH, 'src/extra_static/'), 
) 

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

は、あなたのテンプレートがから直接ロードすることができますINSTALLED_APP

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader', 
    'django.template.loaders.app_directories.Loader' 
) 

TEMPLATE_DIRS = (
    path.join(ROOT_PATH,'src/templates/'), 
) 

上記の2つの戦略は、テンプレートと静的コンテンツが特定のアプリディレクトリ内に存在することを意味します。開発では、contrib.staticfilesを使用して、静的コンテンツをアプリケーションフォルダから直接配信できます。プロダクションでは、すべてのアプリディレクトリの静的コンテンツを/path/to/project/collected_static/に収集する管理コマンドがあります。静的コンテンツを提供するために、そのディレクトリのWebサーバをポイントできます。

あらかじめパッケージ化されたライブラリの場合、virtualenvとpipを使用するとよいでしょう。それ以外の場合は、ライブラリをプロジェクトのルートディレクトリのlibディレクトリに保存します。 site-packages(特にvirtualenvを使用しない場合)にインストールするのではなく、ソース、テンプレート、および静的コンテンツの参照を非常に便利にします。

だから、あなたのプロジェクト構造を再配置:

webapps/ 
    myproject/ 
     apache/ 
     bin/ 
     lib/ 
     collected_static/ 
     uploaded_media/ 
     myproject.wsgi 
     src/ 
      templates/ # lib template overrides and site wide templates 
       base.html 
       lib_1/ 
        nav.html 
      extra_static/ 
       lib_1/ # libs that dont support django 1.3 static 
        js/ 
        css/ 
      settings.py 
      settingslocal.py # keep developer specific settings here 
      urls.py 
      manage.py 
      app1/ 
       __init.py 
       static/ 
        app1/ 
         js/ 
         css/ 
       templates/ 
        app1/ 
+0

静的リソースを格納するための "/ static /"の使用に関連するものは多少ありません...私はAmazonウェブサービス上のBitnami Django VMにDjangoアプリケーションを配備し、静的リソースが戻ってきて404が見つかりませんでした。私は最終的にこれを次の別名を含むdjango.confファイルにたどった: 別名/静的 "xxx/python2.7/site-packages/django/contrib/admin/static" "/ static/xyz "別の場所にエイリアスされ、失敗しました。誰かが同じ問題に遭遇した場合に備えて、これを書き留めておきたい。 – jarmod

0

あなたはここで良い考えを持っています。私の最初の反応は、adminディレクトリが何をしているのかを尋ねることです。管理者はDjangoの一部であり、別個のモジュールは必要ありません。また、アプリ固有のadmin.pyファイルは、それぞれのアプリ内に存在する必要があります。

は、あなたの質問に答えるために:

  • は、静的および動的分離:これは、Webサーバーの設定のレベルで行われています。あなたの場合、あなたのapache virtualhost confには、webapps/staticディレクトリのエントリが必要ですが、他のものは必要ありません。 The documentationには良い例があります。

  • アプリが実際にあなたのプロジェクトから完全に切り離されている場合、それらのアプリケーションはPythonパスに置かれている限り、外に出ることができます。 1つの良い方法は、それらを別々のコードリポジトリに保管し、pipとvirtualenvでプロジェクトにインストールすることです。しかし、私は、あなたのアプリの多くはプロジェクト固有のものであることが分かると思いますので、あなたのプロジェクトディレクトリに住んでください。

  • テンプレートは非常に確かに動的コンテンツです。 Apacheで直接処理すると解析されないので、値ではなく変数とブロックコードのコードがユーザーに表示されます。

3

私の設計者は、テンプレートファイルのために(すべてのPythonパス上で)どこでも狩りに行きたくありません。私のテンプレートのレイアウトは1つのテンプレートフォルダがあり、すべてのアプリケーションがその下にあるという点であなたの次のレイアウトになります。各アプリケーションには、basebase.htmlを拡張する独自のbase.htmlがあります。

最近、私はappsフォルダのpinaxモデルに従っていきます。すべてのアプリケーションがそこに入ります。この理由は、Wingが私にツリーを表示して以来、純粋に審美的です。私のすべてのアプリケーションはツリーのその部分に一緒に集まります。私が気に入らなかったのは、テンプレートやメディア、またはsite_mediaの後にアルファベット順でソートされたアプリでした。木を上下にスクロールすると、私は遅くなった。ツリー内のすべてのアプリを1つの場所に配置することで、コード内のgit commit -m "feature notes" appsチェックインも変更されますが、それはもう1つのプラスです。 basebase.htmlが生まれたと我々はそれ以来それに満足しているよう

webapps/ 
    myvirtenv/ 
    bin/ 
    lib/ 
    myproject/  <- Source control starts here 
     site_media/ 
     collected_static/ 
      js/ 
      css/ 
      img/ 
     uploaded_media/ 
     deploy/ 
      myproject.wsgi 
      procmail scripts 
      apache site files # linked from /etc/apache2/sites-endabled 
     apps/ 
     app1/ 
      templates/  <- This should be here, but in practice I just leave in templates below 
      app1/ 
     app2/ 
     templates/ # lib template overrides and site wide templates 
     basebase.html  <- I changed the name to help my designer 
     app1/ 
     app2/ 
     settings.py 
     gethostname()_local_settings.py # keep machine specific settings here 
     urls.py 
     manage.py 
     requirements 
     base.txt 
     project.txt 

あり、あまりにも多くのbase.htmlファイルがなかったし、それについて話しては、困難でした。

私はstaticfilesアプリケーションで動作しなかったスタティックファイルがありませんでした。私は1.2でそのアプリを使っていました。私は戻って1.3の静的フォルダをやったことはありませんが、今後数ヶ月のうちに作業が始まるでしょう。

私はpinaxから要件フォルダのトリックを得ました。

  1. VIRTUALENV
  2. gitのクローンのURL
  3. ピップ-r要件をインストール\ base.txt -r要件\プロジェクトを作成します。(sqliteのを使用している場合そうでなければ、最初のDB作成の作業を行う必要があり、)
  4. TXTは、/ etc/apache2の
  5. リロードApache設定
  6. 利益から
  7. シンボリックリンクsyncdbの実行を管理します!
+0

これは私がやっていることから成長することができるようですが、私は 'myvirtenv'(私はちょうど' venv'とタイプします)を 'myproject'の中に押し込んでいきます。クローンにとっては素晴らしいですが、startprojectを使用するには、別の(同様の)virtualenvを使用してプロジェクトを作成し、プロジェクトに入り、virtualenvをセットアップする必要があります。私はソースコントロールから 'venv'を無視します。 – sage

関連する問題