Djangoの魔法の謎を解き明かす
公開: 2022-03-10公式文書によると、
Djangoは、迅速な開発とクリーンで実用的な設計を促進する高レベルのPythonWebフレームワークです。 経験豊富な開発者によって構築されており、Web開発の面倒な作業の多くを処理するため、車輪の再発明をしなくてもアプリの作成に集中できます。 これは無料でオープンソースです。
— DjangoProject.com
これは、Webアプリケーションを構築するためのPythonで人気のあるフレームワークの1つであり、設定された構成とファイルを使用して定型文を作成する際のスケーラビリティーとして最も好まれています。 これで、開発者にとってのDjangoの目標全体が終わります。
「...短時間で優れたアプリケーションを構築し、基本的な設定について心配する必要がなくなります。」
構築しているものに関係なく、すべてのWebアプリケーションにまたがる基本的な構成、ファイル、およびスタイルがあります。 Djangoを使用する場合、アプリケーションの開発サイクルのさまざまな時点で特定のコマンドを実行すると、これらが自動的に生成されます。 これにより、Djangoが他のアプリケーションを処理している間、アプリケーション開発のコアな側面に集中するのに十分な時間があります。
それは、ボンネットの下で多くのことが起こっていることを意味します。 可動部品を完全に把握していない人にとって、これは圧倒される可能性があります。 この記事では、次のことについて学習します。
- Djangoのインストール
startproject
およびstartapp
コマンド- 以下を含むDjango構成ファイル。
- settings.py
- urls.py
- manage.py
- モデルのレイアウト
- ルーティング
これらすべてがどのように組み合わされ、それらが果たす役割を学びます。 Djangoの内部で起こっていることすべてを見ることができないことを知っておくことが重要です。 このチュートリアルの範囲外の場合は、それを支援するリソースへのリンクがあります。
学習目的で、eコマースプラットフォームを構築します。 これは本格的なeコマースサイトではありません。アプリケーションには2つの基本機能しかありません。 管理者の視点から製品を作成し、注文します。
この記事では、Djangoのビルド済みコマンド、ファイル、および基本を理解するためのガイドを提供します。 これは、Djangoを使用したことがある、または使用する予定で、内部で何が起こっているのかを知りたい開発者を対象としています。 Djangoを使用している必要はありませんが、この記事を続ける前にDjangoの基本を経験しておくと、利点が得られます。 この記事で取り上げる内容を完全に把握するには、Pythonの実用的な知識が必要です。
Djangoのインストール
Djangoをまだインストールしていない場合は、次の手順でインストールできます。
まず、 djangodev
という名前の仮想環境を作成します。 これは、Djangoワークスペースとその依存パッケージを分離するために必要です。
python3 -m venv ~/.virtualenvs/djangodev
次に、仮想環境に入るには、仮想環境をアクティブ化する必要があります。
source ~/.virtualenvs/djangodev/bin/activate
source
で実行中にエラーが発生した場合は、この代替コマンドを使用できます。
. ~/.virtualenvs/djangodev/bin/activate
Windowsユーザーの場合は、代わりにこれを使用してください。
...\> %HOMEPATH%\.virtualenvs\djangodev\Scripts\activate.bat
注: Djangoを使用するときはいつでも、仮想環境をアクティブ化する必要があります。
仮想環境に入ったので、Djangoをインストールします。
python -m pip install Django
Djangoが正しくインストールされているかどうかを確認するには、;を実行します。
python -m django --version
シャカブーム! これで魔法の準備が整いました。杖を準備してください。
外出先でファイルやフォルダを作成する方法は、単純で簡単かもしれません。 ただし、中規模または大規模のプロジェクトを作成し、期限を守る必要がある場合は理想的ではありません。 個人的なプロジェクトであっても、私たちは常に期限を守る必要があります。
新しい大規模なプロジェクトを作成するときにこの方法に従うと、複数のファイルとフォルダーを作成し、複数の設定を行う必要があります。これにより、回避可能なバグが作成され、多くの無駄な時間が発生する可能性があります。 Djangoを通じて利用できるstartproject
コマンドとstartapp
コマンドは、この問題を解決することを目的としています。 これらの2つのコマンドは、ファイル、フォルダーを作成し、多くの構成を実行します。
startproject
コマンドを使用して新しいアプリケーションを生成することから始めましょう。
アプリケーションの足場
アプリケーションを生成し、生成されたファイルと、使用するいくつかのコマンドを確認します。 ターミナルでこのコマンドを実行して開始します。
django-admin startproject ecommerce_site
Djangoをインストールすると、パスにdjango-admin
が追加され、アクションを実行するためのアクセス権が付与されます。 これは、管理責任のためのDjangoのコマンドラインユーティリティです。 django-admin
が使用する詳細についてはこちらをご覧ください。 この記事の範囲を少し超えています。
startproject
は、プロジェクトの生成に役立つDjangoコマンドです。 ここでは、プロジェクトecommerce_siteの名前を渡します。 次に、 ecommerce_siteというディレクトリにプロジェクトを作成します。 ディレクトリは次のようになります。
新しく作成したディレクトリに移動し、コマンドを実行してアプリを生成する必要があります。
cd ecommerce_site python manage.py startapp trading
startapp
は、プロジェクトディレクトリのmanage.py
によって実行されるコマンドであり、複数のファイルと、コマンドで指定された名前を使用して名前が付けられたフォルダーを作成します。この場合、指定されたのはtrading
です。 appフォルダーは、アプリケーションの機能を作成するために必要な単純なファイルで構成されています。 これで、ディレクトリは次のようになります。
プロジェクトとアプリの違いを知りたい場合。 プロジェクトはDjangoWebアプリケーションであり、1つ以上のアプリで構成できます。 これは、 manage.py
と、 settings.py
およびその他のファイルを含むその他のモジュールを保持するフォルダーです。 アプリは、特定の機能を実行するPythonパッケージであり、 models.py
、移行ディレクトリなどのファイルが含まれています。 詳細については、StackOverflowでこの回答を確認してください。
startproject
はメインプロジェクトディレクトリを作成し、 startapp
はアプリディレクトリを作成します。 どちらにも、生成に使用される名前が渡されます。 startproject
は、新しいプロジェクトを作成するときに実行される最初のコマンドですが、 startapp
は新しいプロジェクトディレクトリ内で実行されます。
現在のレイアウトは、構築しているアプリケーションに使用できる優れたマッピングです。 スケーラブルで、必要なファイルで構成されています。 プロジェクト内でファイルを作成、名前変更、編集、および移動する機会があります。
Djangoの構成
Djangoはさまざまな設定と構成を提供します。異なるファイルで2つのコマンドを実行した後、生成されたファイルを実行して、それぞれが何をするかを学びましょう。
settings.py
ほとんどのWebアプリケーションには、次のような構成が必要です。 ユーザーを検証するための認証、特定の能力を持つ特定のユーザーを許可し、セキュリティ基準を設定するための権限。 これらはすべて、ユーザーに必要な最高のエクスペリエンスを提供するために必要です。 開発者として、作業するすべてのアプリケーションについて、これらのそれぞれを自分でロールし始めるには長い時間がかかります。
Djangoは、これらの必要な構成などを提供します。必要な構成を選択してプラグインできます。これらはsettings.py
で実行され、基本的な機能を提供するために作成された設定が既に用意されています。
Djangoがプロジェクトを実行しようとすると、検索する特定の変数があります。 settings.py
は、他のファイルや情報につながる変数を保持するファイルです。 Djangoはmanage.py
ファイルからこのファイルに転送され、ここから情報を取得したり、他のファイルを読み込んだりします。
これらの構成には次のものが含まれます。
-
DEBUG
DEBUG
機能はTrue
に設定されており、開発中のエラーの読み取りとコードのデバッグが可能です。本番環境(つまり、デプロイ中)ではFalse
に設定する必要があります。 この設定により、Djangoがコードを実行しようとするときに、Djangoを使用してコードをより適切にデバッグできるようになります。 -
INSTALLED_APPS
これは、Djangoで特定の機能を実行するすべてのアプリのリストです。 これには、ユーザー認証に使用されるdjango.contrib.admin'
、管理機能に使用される「django.contrib.admin」、ユーザーに通知や情報を送信するために必要な'django.contrib.messages'
'django.contrib.auth'
のデフォルトのアプリが付属しています。startapp
コマンドを使用して作成した他のアプリは、Djangoで実行する前に、ここに存在する必要があります。 -
MIDDLEWARE
は、Djangoのリクエストとレスポンスを通過する入力と出力を処理するための軽量フレームワークです。 各ミドルウェアはアプリで特定の機能を実行します。たとえば、「django.contrib.auth.middleware.AuthenticationMiddleware'django.contrib.auth.middleware.AuthenticationMiddleware'
は'django.contrib.sessions'
と連携してユーザーをリクエストに関連付けます。 ドキュメントで各ミドルウェアのさらなる機能を確認する必要があります。 -
ROOT_URLCONF
は、リクエストがDjangoアプリケーションに渡されたときにDjangoがurlpatterns
を探すパスへの変数です。 Djangoアプリケーションでリクエストが行われるたびに、Djangoはこの変数を検索し、先頭のファイルをロードして、一致するパスを検索するためにurlpatterns
リストをループします。 -
TEMPLATES
は、ビューを表すHTMLファイルのレンダリングを可能にする設定です。 リクエスト、認証、メッセージアプリと通信します。'BACKEND'
値と'APP_DIRS'
をTrue
に設定すると、Djangoは/ templatesフォルダー内のHTMLファイルを検索できます。OPTIONS
の'context_processors'
は呼び出し可能オブジェクトであり、引数として要求を受け取り、テンプレートがレンダリングされるときにコンテキストとマージします。これらの呼び出し可能オブジェクトは、デバッグ、認証、および要求の処理全般に役立ちます。 -
WSGI_APPLICATION
は、wsgi.py
ファイルのapplication
変数につながるパスです。 -
DATABASE
は、PostgresSQL、MySQL、MongoDBなどの外部データベース(またはデフォルトのsqliteの場合は内部データベース)へのアクセスを保持する辞書です。 これは、この例で使用するPostgresデータベースの例です。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'db_name', 'USER': 'db_user', 'PASSWORD': 'db_password', 'HOST': 'localhost', 'PORT': '', } }
デフォルトのsqliteデータベースを使用することを決定できますが、これは本番環境ではうまく機能しません。 上記のようにPostgresデータベースを設定できます。最初にデータベースを作成し、データベースへの書き込み権限を持つユーザーとパスワードを渡す必要があります。
注:このチュートリアルでは、デフォルトのsqliteデータベースセットをすでに使用できます。 上記は、DjangoでSQLおよびNO-SQLデータベース接続を設定する方法のデモンストレーションです。
-
AUTH_PASSWORD_VALIDATORS
これらは、パスワード検証のために呼び出される関数です。 これらは、ユーザー(および管理者も)レコードの作成、パスワードのリセットおよび変更時に呼び出されます。 それらについては、公式ドキュメントから詳しく知ることができます。
設定に関するその他のドキュメントは、ここにあります。
manage.py
ほとんどのWebプロジェクトには、コマンドが開始するエントリポイントが必要です。 アプリケーションへのゲートウェイとして機能するエントリポイント。 すべてのDjangoプロジェクトでは、通常、 manage.py
ファイルです。
このファイルは、アプリケーションの開始点として必要です。 ここから、すべてのコマンドが実行され、すべてがここから起動します。
manage.py
はdjango-adminと同じ機能を果たします。 また、アプリケーションで使用している構成の場所をDjangoに通知します。 これはデフォルトで設定されており、変更する必要はありません。
def main()
関数を使用して、 settings.py
ファイルのデフォルト設定モジュールを処理します。 実行関数をインポートしようとし、エラーが発生した場合はImportError
をスローします。 それ以外の場合は、 sys.argv
からコマンドラインから渡された引数をすべて取り込んで実行します。
sys.argv
は、ターミナルを介して渡されたコマンドを取り込むリストです。 コマンドラインでsys.argv
python manage.py runserver
を実行すると、sys.argvが["manage.py", "runserver"]
に設定され、これがexecute()
関数に渡されます。
python manage.py startapp trading
やpython manage.py makemigrations
のような引数は、実行のためにそれぞれ[ "manage.py", "startapp", "trading"]
と["manage.py", "makemigrations"]
に設定されます。
ifステートメントは、指定されたコマンドがmanage.py
に設定されている場合に実行されるように設定されています。
django-admin
関数の実行とは別に、サーバーの実行、移行の処理、およびプロジェクトで使用するその他のコマンドでdjango-admin関数を使用します。 プロジェクトをデプロイ、テスト、およびデバッグするときにも必要になります。
モデルレイアウト
Djangoは、シンプルなモデリングレイアウトを提供します。 trading
ディレクトリのmodels.py
ファイルでモデルを設定します。 クラス(またはモデル)は、データベーステーブルが従うレイアウトです。
各テーブルのユーザー(または管理者)から取得するデータ型に基づいてクラスを定義します。 私たちのモデルは、 settings.py
のDATABASE
変数で機能する移行ファイルを作成します。
製品と注文に必要な2つのモデルを作成しましょう。
from django.db import models class Product(models.Model): name = models.CharField(max_length=50) image = models.ImageField(upload_to='products', default='python.png') price = models.IntegerField() description = models.TextField() def __str__(self): return self.name class Order(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE) quantity = models.IntegerField() date = models.DateField(auto_now_add=True) user = models.CharField(max_length=50) def __str__(self): return self.user
製品モデルには、名前、価格、説明、および画像(保存するとproducts
フォルダーにアップロードされます。フォルダーが存在しない場合は作成されます)の列があります。 order
には、 product
( products
テーブルにリンクされている)、数量、日付、およびユーザー列があります。
この情報を使用して、Djangoはアプリのデータベーススキーマを作成します。 また、ProductオブジェクトとOrderオブジェクトにアクセスするためのPythonデータベースアクセスAPIを作成します。 Djangoには移行ツールが組み込まれているため、移行に外部パッケージを使用する必要はありません。
次のステップは、移行コマンドを実行してデータベースに移行することです。 ただし、その前に、プロジェクトディレクトリにアプリとしてtrading
を登録する必要があります。
まず、Djangoでトレーディングディレクトリをアプリとして設定する必要があります。 Djangoはapp.py
ファイルでそれを行います。 このファイルはtrading
をアプリとして登録し、 settings.py
ファイルでさらに使用されます。
ここで、 settings.py
にINSTALLED_APP
でtrading
を追加します。 次のようになります。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'trading.apps.TradingConf', ]
ターミナルで、次のコマンドを実行します。
$ python manage.py makemigrations trading $ python manage.py migrate
注:仮想環境をアクティブ化する必要があり、プロジェクトディレクトリ内にいる必要があります。
python manage.py makemigrations trading
は、トレーディングモジュールで行われた変更を記録し、 models.py
とpython manage.py migrate
の変更のmigration
フォルダーにファイルを作成してから、変更を更新します。
生成された移行ファイルは、 0001_initial.py
という名前のmigration
ディレクトリにあるpython manage.py makemigrations trading
コマンドから見つけることができます。 クラスと列は、ファイル内で作成するためのコマンドとして表示されます。 models.py
にさらに変更が加えられると、ここでより多くのファイルが生成されます。
管理機能
現在のアプリケーションでは、アプリケーションで作成される製品と注文を管理するための管理機能が必要になります。 Djangoは、すでに自由に使える組み込みの管理機能を提供してくれます。 管理アプリ(機能)もINSTALLED_APP
リストに登録されています。 'django.contrib.admin'
。
また、管理者のURLは、URL構成ファイルurls.py
のurlpatterns
リストにも登録されています。 path('admin/', admin.site.urls),
admin.py
ファイルを使用すると、モデルと、モデルで実行されるCRUDアクションを登録できます。
管理者を設定するには、ターミナルでこれを実行します。
$ python manage.py createsuperuser
ユーザー名、メールアドレス、パスワードの入力を求められます。 その後、管理者を正常に作成しました。 管理機能の使用を開始するには、サーバーを実行します。
$ python manage.py runserver
https://127.0.0.1:8000/admin/にアクセスすると、ログインセッションが発生します。ログインすると(作成したユーザー名とパスワードを使用して)、管理ダッシュボードに移動します。
グループとユーザーは、管理者がユーザーの管理と権限にアクセスできるようにするデフォルトの構成です。 それでは、モデルを登録しましょう。
admin.py
に、次の行を追加します。
from django.contrib import admin # Register your models here. from .models import Product, Order admin.site.register(Product) admin.site.register(Order)
from django.contrib import admin
はDjangoから管理機能をインポートし、 models.py
から2つのクラスをインポートして登録し、管理者が製品に対してCRUDアクションを実行してダッシュボードから注文できるようにします。
モデルを登録すると、ダッシュボードは次のようになります。
製品の追加:
管理ダッシュボードからの注文:
簡単なルーティング
すべてのサイトには、エンドユーザー向けの特定の情報を含む特定のページにつながるルートまたはURLが必要です。 同様の情報またはアプリケーションのコレクションは、特定のルートでアクセスされます。 ファイル内のアクセシビリティと通信のためにルートをグループ化する必要があります。 Djangoはurls.py
ファイルでそれを行います。
urls.py
は、 settings.py
のROOT_CONF
変数から派生したファイルです。 ここでメインのURL設定が行われます。 別のファイルやフォルダー、またはurls.py
ファイルにビューを作成する場合は、それらをurlpatterns
リストで構成する必要があります。
Djangoは、ファイルにurlpatterns
という名前のリストを想定しています。 ROOT_CONF
変数内のファイルを、 urlpatterns
リストに配置した他のファイルに変更できます。
urlpatterns = [ path('admin/', admin.site.urls), ]
リストは、 path
またはre-path
のインスタンスであるオブジェクトで構成されます。 各インスタンスには、パターン'admin/'
と、ビューまたはURLファイルadmin.site.urls
の2つの必須パラメーターがあります。
インスタンスは、より多くのURL構成を持つ別のファイルにつながる可能性もあります。 これは読みやすくするために行われます。
views.py
バックエンドアプリケーションの重要な必要性は、各ルートがマップされるビューです。 Djangoでは、アプリの関数またはクラスベースのビューをviews.py
ファイルに記述します。 ビューは、リクエストを処理し、ユーザーにレスポンスを返すクラスまたは関数です。
views.py
ファイルを次のように編集します。
from django.http import HttpResponse def home(request): return HttpResponse("This is a shopping site for products") def order(request): return HttpResponse("Hello, welcome to our store, browse to our products and order!")
ここでは、 HTTPResponse
をインポートして、呼び出されたときに文を返す2つのビュー(関数ビュー)を定義する際に使用します。 プライマリアドレスにアクセスするときにdef home
が呼び出され、注文URLにアクセスするときにdef order
が呼び出されます。
ビューを作成したら、それを別のルート(またはurlpatterns
)に割り当てる必要があります。 これはいくつかの方法で行うことができます。同じファイルにurlpatterns
リストを作成するか、 trading.views
をecommerce_site.urls
ファイルにインポートしてパスを作成することができます。
これを行うための推奨される方法は、サブURL構成ファイル( ecommerce_site.urls
trading
含めることです。 trading
ディレクトリにurls.py
ファイルを作成します。 ディレクトリは次のようになります。
trading/ __init__.py admin.py apps.py migrations/ __init__.py 0001_initial.py models.py tests.py urls.py views.py
次のコードを新しいファイル( urls.py
)に追加します
from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), path('order/', views.order, name='order'), ]
trading
URL設定ファイル( urls.py
)をプロジェクトURL設定ファイルに登録しましょう。
from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('', include('trading.urls')) ]
urlpatterns
にアクセスできるようにするには、2行目のdjango.urls
のinclude
クラスを使用します。次に、パターンを選択し、トレーディングディレクトリにurls.py
ファイルを添付します。
ここで行ったことは、djangoからpath
クラスとviews.py
ファイルをインポートすることでした。 次に、リストは各ビューの2つのパスインスタンスで構成されます。 したがって、 def home
はhttps://127.0.0.1:8000/で呼び出されます。
そして、 def order
はhttps://127.0.0.1:8000/order/で呼び出されます。
注: startproject
とstartapp
を実行するプロセスは必須ではありませんが、Djangoによって強く推奨されています。 また、各コマンドを実行した後、作業に便利なようにファイルやフォルダーを作成/移動できます。
依存関係ツリー
Djangoが着信URLからのリクエストを処理するプロセスは次のとおりです。
- Djangoは、
ROOT_CONF
変数でURLのルートロケーション(パス)を検索します。 - Djangoは、指定されたパスで指定されたpythonファイルをロードします。 そして、
urlpatterns
変数を見つけます。これは、django.urls.path()
および/またはdjango.urls.re_path()
のすべてのインスタンスを含むリストです。 - リストでは、Djangoが順番に進み、一致するURLを探します。
- Pythonは、ビュー(関数ベースまたはクラスベースのビュー)をインポートして呼び出します。 これは、HTTPリクエストでさらに渡されます。
- ビューは渡された要求と情報を処理し、メッセージ/テンプレートを返すか、別のビューにリダイレクトします。
- 一致するURLパターンがない場合、またはこのプロセスのいずれかの時点で例外が発生した場合、Djangoは適切なエラー処理ビューを呼び出します。
結論
コマンドラインなしでDjango用のファイルを作成できる可能性があることを学びました。 また、Djangoプロジェクトの利点と構成要素についても学びました。 Djangoは、シンプルさを生み出すことを目的としたバックエンドプロジェクトを構築するための素晴らしいツールです。
このチュートリアルのコードはGitHubで確認できます。
資力
- Djangoでのパスワード管理
- Django:はじめに
- Django:設定
- O'Reillyによる軽量Django