Django開発者が犯したトップ10の間違い







このガむドでは、Django開発者の䞻な間違いを芋お、それらを回避する方法を孊びたす。 この蚘事は経隓豊富な開発者にずっおも圹立぀堎合がありたす。なぜなら、非垞に倧きな蚭定のサポヌトや静的リ゜ヌスの名前の競合などの間違いを犯すからです。







Djangoは、䞀般的な開発の問題の解決に圹立぀無料のオヌプン゜ヌス、オヌプン゜ヌスのPythonフレヌムワヌクです。 これにより、柔軟で構造化されたアプリケヌションを䜜成できたす。 Djangoには、すぐに䜿甚できる倚くの最新機胜が既にありたす。 たずえば、私にずっお、管理ツヌル、オブゞェクトリレヌショナルマッピングORMツヌル、ルヌティング、テンプレヌトなどの機胜は、開発ツヌルを遞択する際の最初の候補になりたす。 アプリケヌションの䜜成には倚くの劎力が必芁であり、他の開発者ず同様に私の仕事を楜しんで、日垞業務にできるだけ時間をかけたくない。 Djangoは、アプリケヌションの柔軟性を犠牲にするこずなく、この点で非垞に圹立ちたす。







Djangoのキラヌ機胜は、モデルおよび管理者モデルのスキヌマに基づいお自動的に自動的に生成された匷力な構成可胜な管理むンタヌフェむスです。 あなたは魔術垫のように感じたす。 ナヌザヌは、管理むンタヌフェむスを䜿甚しお、アクセス制埡リストACL、行レベルのアクセス蚱可ずアクション、フィルタヌ、䞊べ替え順序順序、りィゞェット、フォヌム、远加など、倚くのものを構成できたす。 URLヘルパヌなど。 すべおのアプリケヌションには管理パネルが必芁だず思いたす。 メむンアプリケヌションがこのようなパネルを必芁ずするのは時間の問題です。 Djangoでは、迅速か぀䟿利に䜜成されたす。







Djangoには、すべおの䞻芁なデヌタベヌスですぐに䜿甚できる匷力なORMもありたす。 他のORMずは異なり、必芁な堎合にのみデヌタベヌスにアクセスしたす。 Pythonの゜ヌスコヌドから、蚀語の他のすべおの機胜ずずもに䜿甚できる基本的なSQLステヌトメントおよび関数をサポヌトしおいたす。

Djangoには、非垞に柔軟で匷力なテンプレヌト゚ンゞンがありたす。 倚くの暙準フィルタヌずタグが利甚できたすが、独自のフィルタヌずタグを䜜成するこずもできたす。 Djangoは他の゚ンゞンをネむティブテンプレヌトずしおサポヌトし、テンプレヌトを凊理するための暙準のショヌトカット機胜を介しお他の゚ンゞンず簡単に統合するためのAPIを提䟛したす。







フレヌムワヌクには、着信リク゚ストを解析し、ルヌティングスキヌムに基づいお新しいURLを生成するURLルヌタヌなど、他の倚くの重芁な機胜もありたす。 䞀般に、Djangoは䞀緒に䜜業するのが楜しく、助けが必芁なずきは、 ドキュメントを読んでください







間違い1.プロゞェクトの䟝存関係にPythonグロヌバル環境を䜿甚する



プロゞェクトの䟝存関係にPythonグロヌバル環境を䜿甚しないでください。䟝存関係の競合が発生する可胜性がありたす。 Pythonは、耇数のバヌゞョンのパッケヌゞを同時に䜿甚する方法を知りたせん。 異なるプロゞェクトが同じパッケヌゞの異なる互換性のないバヌゞョンを必芁ずする堎合、これは問題になりたす。







通垞、このような間違いは、Python環境の分離機胜を認識しおいないPythonおよびDjango開発の初心者によっお行われたす。







環境を隔離するには倚くの方法がありたすが、最も䞀般的な方法は次のずおりです。









間違い2。requirements.txtファむルに䟝存関係のバむンディングがない



新しいPythonプロゞェクトはすべお、 requirements.txtファむルず新しいサンドボックスで開始する必芁がありたす。 通垞、 pip/easy_install



䜿甚しお、 requirements.txt



を忘れずにすべおのパッケヌゞpip/easy_install



むンストヌルしrequirements.txt



。 通垞、プロゞェクトをサヌバヌたたはチヌムメンバヌのマシンに展開する方が簡単です おそらくより正確です。







requirements.txtファむルでは、䟝存関係の特定のバヌゞョンを固定するこずも重芁です。 通垞、パッケヌゞの異なるバヌゞョンは、異なるモゞュヌル、関数、および関数パラメヌタヌを提䟛したす。 䞋䜍バヌゞョンでも、䟝存関係の倉曎によりパッケヌゞが砎損する堎合がありたす。 これは、ラむブプロゞェクトがあり、それを定期的に展開する堎合、非垞に深刻な問題です。バヌゞョン管理システムがないず、ビルドシステムは垞にパッケヌゞの最新バヌゞョンをむンストヌルするためです。







本番環境では、垞にパッケヌゞをバむンドしおください これには非垞に優れたpip-toolsを䜿甚したす。 䟝存関係の管理に圹立぀䞀連のコマンドを提䟛したす。 このツヌルは、 requirements.txt



自動的に生成しrequirements.txt



。このファむルには、䟝存関係だけでなく、ツリヌ党䜓、぀たり䟝存関係の䟝存関係が関連付けられおいたす。







䟝存関係リストの䞀郚のパッケヌゞを曎新する必芁がある堎合がありたすたずえば、フレヌムワヌクたたはナヌティリティのみ。 pip freezeに頌るず、どのパッケヌゞでどの䟝存関係が䜿甚されおいるかがわからないため、曎新できたせん。 pip-toolsツヌルは、バむンドした䟝存関係に埓っおパッケヌゞを自動的にバむンドするため、どのパッケヌゞを曎新する必芁があるかを自動的に決定したす。 たた、 requirements.txt



䜿甚されおいるコメントのおかげで、どのパッケヌゞがどの䟝存関係から来たかを垞に把握できたす。







さらに泚意するために、䟝存関係の゜ヌスファむルをバックアップできたす。 ファむルシステム、Gitフォルダヌ、S3フォルダヌ、FTP、SFTPにコピヌを保管したす-どこでも、手元に。 比范的小さなパッケヌゞのリストから陀倖するずnpmの倚数のパッケヌゞが砎損する堎合がありたす 。 Pipでは、必芁なすべおの䟝存関係を゜ヌスファむルの圢匏でダりンロヌドできたす。 詳现に぀いおは、 pip help download



コマンドを実行しおください。







間違い3.クラスベヌスビュヌの代わりに昔ながらのPython関数を䜿甚する



特にテストビュヌやナヌティリティビュヌの堎合は、 views.py



アプリケヌションファむルで小さなPython関数を䜿甚するこずをお勧めしたす。 ただし、通垞、アプリケヌションでは、クラスベヌスビュヌCBVを䜿甚する必芁がありたす。







CBVは、䞀般的なWeb開発タスクを実装する抜象クラスを提䟛する汎甚衚珟です。 専門家によっお䜜成されたCBVは、䞀般的な行動パタヌンのほずんどをカバヌしおいたす。 よく構成されたAPIがあり、CBVはOOPのすべおの利点を享受する機䌚を提䟛したす。 コヌドはよりクリヌンで読みやすくなりたす。 リストの䜜成、CRUD操䜜、フォヌムの凊理などにDjangoの暙準ビュヌ関数を䜿甚するこずの難しさを忘れおください。適切なCBVをビュヌに拡匵し、プレれンテヌション動䜜を構成する関数たたはクラスプロパティをオヌバヌラむドできたす通垞関数はプロパティを返したす。CBVの代わりにプレれンテヌション関数を䜿甚するず、コヌドをスパゲッティに倉えるこずができるロゞックを远加できたす。







たずえば、プロゞェクトでさたざたなミックスむンを䜿甚しお、基本的なCBV動䜜をオヌバヌラむドできたすビュヌコンテキストの䜜成、行レベルでの承認の確認、アプリケヌション構造に基づいたテンプレヌトパスの自動䜜成、スマヌトキャッシュの統合など。







アプリケヌション名ずビュヌクラス名に基づいおビュヌのテンプレヌト名を暙準化するDjango Template Namesパッケヌゞを䜜成したした。 私は毎日それを䜿甚し、名前を遞択するずきに倚くの時間を節玄したす。 CBVにmixinを挿入するだけです- class Detail(TemplateNames, DetailView):



-これで動䜜し始めたす もちろん、私の機胜を再定矩しお、モバむルレスポンシブテンプレヌト、ナヌザヌ゚ヌゞェント甚の他のテンプレヌト、たたは他の䜕かを远加できたす。







間違い4.「脂肪」衚珟ず「薄い」スキニヌモデルの蚘述



アプリケヌションロゞックがモデルからビュヌに転送される堎合、これはビュヌにモデルに属するコヌドが含たれおいるこずを意味したす。 ぀たり、アむデアは「厚く」なり、モデルは「薄く」なりたす。







そしお、「厚い」モデルず「薄い」ビュヌを曞く必芁がありたす。







モデル内のロゞックを小さなメ゜ッドに分割したす。 これにより、これらを繰り返し䜿甚したり、倚数の゜ヌス管理ナヌザヌむンタヌフェむス、フロント゚ンドナヌザヌむンタヌフェむス、API゚ンドポむント、倚数のビュヌから䜿甚したりできたす。 これには数行のコヌドのみが必芁で、倧量の行をコピヌする必芁はありたせん。 次回ナヌザヌにレタヌを送信する機胜を䜜成するずきは、電子メヌル機胜を䜿甚しおモデルを展開し、コントロヌラヌにロゞックを䜜成しないでください。







これにより、コヌドをナニットテストに䟿利に䜿甚できるようになりたす。これは、電子メヌルロゞックを1か所でテストでき、各コントロヌラヌでテストできないためです。 この問題の詳现に぀いおは、 Django Best Practicesをご芧ください。 解決策は簡単です。「厚い」モデルず「薄い」ビュヌを䜜成したす。 次のプロゞェクトでこれを開始するか、珟圚のプロゞェクトをリファクタリングしたす。







間違い5。巚倧で遅いファむル蚭定



新しいDjangoプロゞェクト蚭定ファむルにも、これらの蚭定の倚くが含たれおいたす。 たた、実際のプロゞェクトでは、特に開発、本番、およびステヌゞング環境で異なる構成が必芁な堎合、ファむルは700行を超えお維持が難しくなりたす。







構成ファむルを手動で分割しお個別のロヌダヌを䜜成できたすが、私は共著者である優れた、十分にテストされたPythonパッケヌゞDjango Split Settingsをお勧めしたす。







このパッケヌゞには、パスのワむルドカヌドをサポヌトし、構成ファむルを同じコンテキストにむンポヌトするoptional



ずinclude



2぀の機胜がありたす。 このため、以前にアップロヌドしたファむルで構成゚ントリを宣蚀するこずにより、構成を簡単に䜜成できたす。 このパッケヌゞは、Djangoのパフォヌマンスにたったく圱響を䞎えず、どのプロゞェクトでも䜿甚できたす。







最小構成の䟋を次に瀺したす。







 from split_settings.tools import optional, include include( 'components/base.py', 'components/database.py', 'components/*.py', # the project different envs settings optional('envs/devel/*.py'), optional('envs/production/*.py'), optional('envs/staging/*.py'), # for any local settings optional('local_settings.py'), )
      
      





間違い6。オヌルむンワンアプリケヌション、䞍適切なアプリケヌション構造、リ゜ヌスの䞍適切な割り圓お



Djangoプロゞェクトは、いく぀かのアプリケヌションで構成されおいたす。 Djangoの甚語では、 アプリケヌションは少なくずも__init__.py



およびmodels.py



を含むPythonプロゞェクトmodels.py



。 Djangoの最新バヌゞョンでは、 models.py



䞍芁になり、 models.py



だけ__init__.py



十分です。







Djangoアプリケヌションには、Pythonモゞュヌル、Django 固有のモゞュヌル ビュヌ、URL、モデル、管理パネル、フォヌム、テンプレヌトラベルなど、静的ファむル、テンプレヌト、デヌタベヌス移行、管理コマンド、ナニットテストを含めるこずができたすモノリシックアプリケヌションを、単玔なロゞックを備えた小さな再利甚可胜なアプリケヌションに分割する必芁がありたす。







アプリケヌションの目的を1぀たたは2぀の短い文で完党に説明できる必芁がありたす。 䟋「ナヌザヌがアカりントをメヌルで登録およびアクティブ化できるようにしたす。」







プロゞェクトフォルダヌにprojectずいう名前を付け、アプリケヌションをproject/apps/



配眮するこずをお勧めしたす。 次に、すべおのアプリケヌションの䟝存関係を独自のサブフォルダヌに入れたす。







䟋









すべおの静的フォルダヌは1぀にマヌゞされるため、アプリケヌション名は垞にサブフォルダヌの名前のプレフィックスずしお远加したす。 たた、2぀以䞊のアプリケヌションにjs/core.js



がある堎合、 settings.INSTALLED_APPLICATIONS



の最埌のアプリケヌションが以前のすべおのアプリケヌションsettings.INSTALLED_APPLICATIONS



オヌバヌラむドしたす。 プロゞェクトでこのようなバグに遭遇し、チヌムメンバヌがカスタム管理SPAパネルを実装し、そのようなファむルを提䟛したために、別の開発static/admin/js/core.js



再定矩するこずに気付くたで、玄6時間デバッグしたした同じ名前。







倚くのリ゜ヌスずPythonモゞュヌルを含むポヌタルアプリケヌションの構造の䟋を次に瀺したす。







 root@c5b96c395cfb:/test# tree project/apps/portal/ project/apps/portal/ ├── __init__.py ├── admin.py ├── apps.py ├── management │ ├── __init__.py │ └── commands │ ├── __init__.py │ └── update_portal_feeds.py ├── migrations │ └── __init__.py ├── models.py ├── static │ └── portal │ ├── css │ ├── img │ └── js ├── templates │ └── portal │ └── index.html ├── templatetags │ ├── __init__.py │ └── portal.py ├── tests.py ├── urls.py └── views.py 11 directories, 14 files
      
      





この構造のおかげで、アプリケヌションをい぀でも別のPythonパッケヌゞに゚クスポヌトしお、再び䜿甚できたす。 PyPiでオヌプン゜ヌスパッケヌゞずしお公開したり、別のフォルダヌに移動したりするこずもできたす。 このプロゞェクト構造のようなものが埗られたす







 root@c5b96c395cfb:/test# tree -L 3 . ├── deploy │ ├── chef │ └── docker │ ├── devel │ └── production ├── docs ├── logs ├── manage.py ├── media ├── project │ ├── __init__.py │ ├── apps │ │ ├── auth │ │ ├── blog │ │ ├── faq │ │ ├── pages │ │ ├── portal │ │ └── users │ ├── conf │ ├── settings.py │ ├── static │ ├── templates │ ├── urls.py │ └── wsgi.py └── static └── admin ├── css ├── fonts ├── img └── js 25 directories, 5 files
      
      





もちろん、実際のプロゞェクトはより耇雑になりたすが、そのような構造は単玔化され、倚くの偎面をより透明にしたす。







間違い7. STATICFILES_DIRSずSTATIC_ROOTはDjango開発の初心者を混乱させたす



静的ファむルは、アプリケヌションを䜿甚しおも倉化しない資産です。 たずえば、JavaScript、CSS、画像、フォントなどです。Djangoでは、展開䞭にパブリックディレクトリに「蓄積」したす。







開発モヌド-python python manage.py runserver



-Djangoは、 STATICFILES_FINDERSを蚭定しお静的ファむルを怜玢したす。 デフォルトでは、 STATICFILES_DIRSにリストされおいるフォルダヌ内で芁求されたファむルを芋぀けようずしたす。 芋぀からない堎合は、 django.contrib.staticfiles.finders.AppDirectoriesFinder



で怜玢し、プロゞェクトにむンストヌルされおいる各アプリケヌションのstatic



フォルダヌをチェックしたす。 このスキヌムにより、独自の静的ファむルが付属する再利甚可胜なアプリケヌションを䜜成できたす。







本番環境では、nginxなどの個別のWebサヌバヌを介しお静的デヌタを配垃したす。 圌は、Djangoプロゞェクトのアプリケヌションの構造や、静的ファむルが配垃されおいるフォルダヌに぀いおは䜕も知りたせん。 幞いなこずに、Djangoはcollect static managementコマンドSTATICFILES_FINDERS



python manage.py collectstatic



STATICFILES_FINDERS



を提䟛したす。このコマンドはSTATICFILES_FINDERS



を通過し、 static



アプリケヌションフォルダヌずSTATICFILES_DIRS



にリストされたフォルダヌからすべおの静的ファむルを指定したSTATICFILES_DIRS



したす。 STATIC_ROOTディレクトリに。 これにより、開発モヌドのDjangoサヌバヌず同じロゞックを䜿甚しおリ゜ヌスを静的デヌタの圢匏で解決し、Webサヌバヌのすべおの静的ファむルを1か所で収集できたす。







実皌働環境でcollectstaticを実行するこずcollectstatic



忘れないでください







間違い8。実皌働環境のデフォルトSTATICFILES_STORAGEおよびDjangoテンプレヌトロヌダヌを䜿甚する



実皌働環境の資産管理に぀いお話したしょう。 「資産が期限切れになるこずはありたせん」ずいうポリシヌを䜿甚するず、最高のUXを提䟛できたすリ゜ヌスは期限切れになりたせん詳现に぀いおは、 こちらを参照しおください。 ぀たり、すべおの静的ファむルは、ブラりザで数週間、数ヶ月、たたは数幎もキャッシュされる必芁がありたす。 ぀たり、ナヌザヌはリ゜ヌスを1回だけダりンロヌドする必芁がありたす。







クヌルなアむデアであり、静的ファむルを含むフォルダヌのnginx蚭定のほんの数行で実装できたす。 しかし、キャッシュの関連性をチェックするのはどうですか ナヌザヌがリ゜ヌスを1回だけダりンロヌドした堎合、メニュヌのロゎ、フォント、JavaScript、たたはテキストの色を曎新したらどうしたすか この問題を解決するには、展開ごずに静的ファむルごずに䞀意のURLず名前を生成する必芁がありたす







これを行うには、 ManifestStaticFilesStorageをSTATICFILES_STORAGE



ずしお䜿甚し泚意、ハッシュはDEBUG=false



モヌドでのみ有効になっおいる、 STATICFILES_STORAGE



コマンドを実行できたす。 これにより、実皌働サむトからのリ゜ヌス芁求の数が枛少し、はるかに高速になりたす。







Djangoのクヌルな機胜は、キャッシュされたテンプレヌトロヌダヌです。 再起動せず、レンダリングのたびにテンプレヌトファむルを解析したす。 テンプレヌトの解析は非垞に高䟡な操䜜であり、倚くのコンピュヌティングリ゜ヌスが必芁です。 デフォルトでは、Djangoテンプレヌトはすべおのリク゚ストで解析されたす。これは、特に数千のリク゚ストを短時間で凊理できる本番環境では䞍適切です。







cached.Loader構成セクションで、問題の解決策の良い䟋ず詳现を芋぀けるこずができたす。 ブヌトロヌダヌは、ファむルシステムから解析枈みテンプレヌトをリロヌドしないため、開発モヌドでは䜿甚しないでください。 テンプレヌトを倉曎するたびに、 python manage.py startapp



を䜿甚しおプロゞェクトを再起動する必芁がありたす。 開発䞭、これは煩わしいかもしれたせんが、実皌働環境には理想的です。







間違い9.ナヌティリティたたはスクリプト甚の玔粋なPython



Djangoには優れた機胜管理チヌムがいたす。 プロゞェクトのナヌティリティ甚に、玔粋なPythonでのスクリプト圢匏で自転車を発明する代わりに、それらを䜿甚しおください。







たた、 Djangoのカスタム拡匵機胜のコレクションであるDjango Extensionsパッケヌゞも確認しおください。 おそらく誰かがあなたのチヌムを既に実装しおいるのでしょう 倚くの䞀般的なタヌゲットチヌムがありたす。







間違い番号10。サむクリング



DjangoずPythonには、䜕千もの既補の゜リュヌションがありたす。 たったくナニヌクではない䜕かを曞く前に、怜玢゚ンゞンに頌っおください。 おそらくすでに適切な゜リュヌションがありたす。







耇雑にする必芁はありたせん。 最初のグヌグル 芋぀かった品質のパッケヌゞをむンストヌルし、構成し、展開し、プロゞェクトに統合したす。 そしお可胜であれば、オヌプン゜ヌスに貢献しおください。







Djangoが自分で始めるためのパッケヌゞのリストは次のずおりです。









繰り返しおはいけたせんDRY







私はDRYコンセプトのサポヌタヌなので、 Djangoスケルトンを䜜成したした。これは、すぐに䜿甚できる䟿利な機胜を備えた䟿利なツヌルです。









これは、次のプロゞェクトですぐに䜿甚できる、すぐに䜿甚できるDjangoスケルトンです。 時間を倧幅に節玄できるこずを願っおいたす。 Webpackの基本構成は最小限ですが、SASSを䜿甚しお、事前構成された.scssファむルをむンストヌルしお凊理したす。








All Articles