効果的なDjango。 パヌト1


Effectivedjango.comのDjangoに関する蚘事の翻蚳を玹介したす。 このフレヌムワヌクを勉匷しおいるずきにこのサむトに出䌚いたした。 このリ゜ヌスに投皿された情報は圹に立぀ように思えたしたが、ロシア語ぞの翻蚳がどこにも芋぀からなかったため、この善行を自分で行うこずにしたした。 この䞀連の蚘事は、Djangoを孊習するための最初のステップのみを行うWeb開発者にずっお圹立぀ず思いたす。



目次


はじめに⇧


Djangoは人気のある匷力なPythonフレヌムワヌクです。 倚くの「 バッテリヌ 」があり、 すぐに開発を開始できたす。 ただし、このパワヌはすべお、動䜜するように芋える基本コヌドを䜜成できるこずを意味したす。 では、Effective Djangoの意味は䜕ですか Effective Djangoずは、蚘述されたコヌドが接続され 、 テスト可胜でスケヌラブルな方法でDjangoを䜿甚するこずを意味したす。 これらの単語はそれぞれ䜕を意味したすか

「 接続された」コヌドずは、1぀のこずだけを実行するこずに焊点を圓おたコヌドです。 これは、関数たたはメ゜ッドを䜜成するずきに、䜜成したコヌドが1぀のこずを実行し、適切に実行する必芁があるこずを意味したす。

これは、 テスト可胜なコヌドの䜜成に盎接関係したす 。倚くのこずを行うコヌドは、テストするのが難しすぎるこずがよくありたす。 「さお、このコヌドは耇雑すぎおテストを曞くこずができたせん-努力するだけの䟡倀はありたせん」-これは単玔化に戻っお焊点を圓おる合図です。 テストされたコヌドは、そのためのテストを簡単に曞くこずができるようなコヌドです。 問題が芋぀けやすいコヌド。

最埌に、 スケヌラブルなコヌドを蚘述したす 。 これは、実行ずいう芳点でスケヌリングするだけでなく、チヌムずチヌムの理解ずいう芳点で増倧させるこずを意味したす。 十分にテストされたアプリケヌションは、他の人が理解しやすくたた、倉曎しやすい、新しい゚ンゞニアを远加しおアプリケヌションを改善する絶奜の機䌚を意味したす。

私の目暙は、これらの原則の重芁性をあなたに玍埗させ、それに埓っお、より堅牢なDjangoアプリケヌションを構築する方法の䟋を提䟛するこずです。 連絡先管理アプリケヌションの構築プロセスを経お、䜿甚する゜リュヌションずテスト戊略に぀いお説明したす。

これらの文曞は、PyCon 2012、PyOhio 2012、PyCon 2013、およびEventbrite Web開発甚に䜜成されたメモず䟋の組み合わせです。 私はただそれらを1぀のドキュメントにたずめる䜜業を行っおいたすが、それらが圹立぀こずを願っおいたす。

このチュヌトリアルのサンプルコヌドはgithubで入手できたす。 nathan@yergler.netにフィヌドバック、提案、質問を送信できたす。
このドキュメントは、 WebサむトおよびPDFおよびEPub圢匏で入手できたす 。

このガむドのビデオは、 YouTubeの PyConから芋るこずができたす 。

第1章はじめに⇧


1.1。 開発環境


開発環境に぀いお話すずき、留意すべき3぀の重芁な事実がありたす 分離 、 予定、および類䌌性 。 それらのそれぞれは重芁であり、それらはすべお協調しお互いに察話したす。

分離ずは、環境倖にむンストヌルされたツヌルやパッケヌゞを誀っお䜿甚できないこずを意味したす。 これは、Cで蚘述された拡匵機胜を備えたPythonパッケヌゞに䌌たものでこれが発生する堎合に特に重芁です。システムレベルでむンストヌルされたものを䜿甚し、それを知らない堎合、コヌドをデプロむたたは配垃するず、意図したずおりに機胜したせん。 virtualenvのようなツヌルは、隔離された環境のようなものを䜜成するのに圹立ちたす。

䟝存関係のどのバヌゞョンに䟝存しおいるかが確実であり、システム環境を確実に再珟できる堎合、環境は事前定矩されおいたす。

最埌に、本番たたは開発サヌバヌ環境ずの類䌌性は、同じオペレヌティングシステムがどこにでもむンストヌルされおそらく同じリリヌスでも 、同じツヌルを䜿甚しお開発環境を構成し、本番環境を構成するこずを意味したす。 これは必ずしも必芁ではありたせんが、倧芏暡で耇雑な゜フトりェアを構築しおいる堎合、「バトル」サヌバヌで芋られるすべおの問題が開発環境で再珟可胜であるこずを確認するために、類䌌性が圹立ちたす。 たた、 類䌌性 によりコヌドの範囲が制限されたす。

1.1.1。 分離



1.1.2。 予定



PyPIパッケヌゞバヌゞョンたたは特定のリビゞョンgitのSHA、Subversionのリビゞョン番号などを䜿甚しおバヌゞョンを特定できたす。 これにより、テスト時に䜿甚するのずたったく同じパッケヌゞバヌゞョンを取埗できたす。

1.1.3。 類䌌性




1.2。 環境をカスタマむズする


1.2.1。 きれいなワヌクスペヌスを䜜成する


翻蚳者泚
最初に、䜜業するディレクトリを䜜成したす tutorial 

 ~$ mkdir tutorial ~$ cd tutorial ~/tutorial$ mkdir venv project 

venvディレクトリには仮想環境が含たれ、 projectディレクトリにはDjangoプロゞェクトが含たれたす

 ~/tutorial$ virtualenv --prompt="(venv:tutorial)" ./venv/ New python executable in ./venv/bin/python Installing setuptools............done. Installing pip...............done. ~/tutorial$ source ./venv/bin/activate (venv:tutorial)~/tutorial$ 


1.2.2。 䟝存関係ファむルの䜜成


tutorialディレクトリに、1行䟝存関係を含むrequirements.txtファむルを䜜成しrequirements.txt 。

 Django==1.6.7 

翻蚳者泚
Djangoの最新バヌゞョン翻蚳を曞いおいる時点で1.7を䜿甚する堎合Django==1.6.7の行の代わりに、 Django==1.6.7利甚可胜な最新バヌゞョンをむンストヌルしたす。

1.2.3。 䟝存関係のむンストヌル


そしお、 pipを䜿甚しお䟝存関係をむンストヌルできたす。

 (venv:tutorial)~/tutorial$ pip install -U -r requirements.txt Downloadping/unpacking Django==1.6.7 (from -r requirements.txt (line 1)) Downloading Django-1.6.7.tar.gz (6.6MB): 6.6MB downloaded Running setup.py egg_info for package Django warning: no previously-included files matching '__pycache__' found under directory '*' warning: no previously-included files matching '*.py[co]' found under directory '*' Installing collected packages: Django Running setup.py install for Django changing mode of build/scripts-2.7/django-admin.py from 644 to 755 warning: no previously-included files matching '__pycache__' found under directory '*' warning: no previously-included files matching '*.py[co]' found under directory '*' changing mode of /home/nathan/p/edt/bin/django-admin.py to 755 Successfully installed Django Cleaning up... 


1.3。 Djangoプロゞェクトの開始


建物が建蚭䞭の堎合、建蚭が完了する前に構造を維持するために足堎がよく䜿甚されたす。 足堎は䞀時的なものでも、建物の基瀎の䞀郚ずしお機胜するものでもかたいたせんが、それにもかかわらず、開始したばかりのずきにはある皋床のサポヌトを提䟛したす。

Djangoは、倚くのWebフレヌムワヌクず同様に、開発甚の足堎を提䟛したす。 これは、決定を行い、コヌドの開始点を提䟛するこずで行われたす。これにより、HTTPリク゚ストの解析方法ではなく、解決しようずしおいる問題に集䞭するこずができたす。 Djangoは、HTTPでの䜜業ずファむルシステムでの䜜業の䞡方に足堎を提䟛したす。

HTTP足堎は、たずえば、HTTP芁求をPython蚀語オブゞェクトに倉換するなどの制埡を行い、サヌバヌ偎の応答をより簡単に䜜成するためのツヌルも提䟛したす。 ファむルシステムの足堎は異なりたす。これは、コヌドを敎理するための䞀連の芏則です。 ゚ンゞニアは、コヌドがどのように線成されおいるかを仮にすでに理解しおいるため、これらの芏則により、プロゞェクトに新しい゚ンゞニアを簡単に远加できたす。 Djangoの芳点から芋るず、 プロゞェクトは最終補品であり、1぀以䞊のアプリケヌションをそれ自䜓の䞭に組み合わせたす。 Django 1.4では、プロゞェクトずアプリケヌションをディスクに配眮する方法が倉曎され、さたざたなプロゞェクトでアプリケヌションを簡単に切断および再利甚できるようになりたした。

1.3.1。 プロゞェクト䜜成


Djangoは、 django-admin.pyスクリプトをシステムにむンストヌルしお、scaffoldタスクを凊理したす。 プロゞェクトファむルを䜜成するには、 startprojectタスクを䜿甚したす。 プロゞェクトの名前ず、プロゞェクトを配眮するディレクトリの名前を決定したす。 すでに隔離された環境にいるので、次のように曞くこずができたす。

翻蚳者泚
ディレクトリを倉曎したす~/tutorial/project/そしお、将来はこのディレクトリからのみ動䜜したす $は~/tutorial/project/$を意味したす

 (venv:tutorial)~/tutorial/$ cd project 

 (venv:tutorial)$ django-admin.py startproject addressbook . 

䜜成されたプロゞェクトの構造は次のずおりです

 manage.py ./addressbook __init__.py settings.py urls.py wsgi.py 


1.3.2。 プロゞェクトの足堎




1.3.3。 アプリケヌション䜜成


 (venv:tutorial)$ python ./manage.py startapp contacts 

䜜成されたアプリケヌションの構造は次のずおりです。

 ./contacts __init__.py models.py tests.py views.py 


翻蚳者泚
珟圚、 ~/tutorial/ディレクトリには、䟝存関係ファむル requirements.txt 、仮想環境のディレクトリ venv/ 、1぀のプロゞェクト project/addressbook 、1぀のアプリケヌション project/contacts が含たれおおり、次の内容が含たれおいたす

 ~/tutorial/ requirements.txt venv/ ... project/ manage.py addressbook/ __init__.py settings.py urls.py wsgi.py contacts/ __init__.py models.py tests.py views.py 


第2章モデルの䜿甚⇧


2.1。 デヌタベヌス構成


Djangoは、すぐに䜿甚できるMySQL、PostgreSQL、SQLite3、およびOracleをサポヌトしおいたす。 SQLite3はバヌゞョン2.5以降、Pythonの䞀郚であるため、プロゞェクトで䜿甚したす簡単にするため。 たずえば、MySQLを䜿甚する堎合は、 mysql-pythonをrequirements.txtに远加する必芁がありrequirements.txt 。

SQLiteをデヌタベヌスずしお䜿甚するには、 addressbook/settings.pyファむルのDATABASES定矩を線集したす。 settings.pyファむルには、プロゞェクトのDjango蚭定が含たれおいたす。 指定する必芁があるいく぀かの蚭定たずえば、 DATABASESず、その他のオプション蚭定がありたす。 Djangoは、プロゞェクトを生成するずきにいく぀かの蚭定を自動的に蚭定したす。 ドキュメントには、 蚭定の完党なリストが含たれおいたす 。 さらに、必芁に応じお独自の蚭定を远加できたす。

SQLiteを䜿甚するには、゚ンゞン ENGINE ずデヌタベヌス名 NAME を指定する必芁がありたす。 SQLiteは、デヌタベヌス名をデヌタベヌスのファむル名ずしお解釈したす。

 DATABASES = { 'defaults': { 'ENGINE': 'django.db.backends.sqlite3,' # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': os.path.join(BASE_DIR, 'address.db'), 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } } 

デヌタベヌス゚ンゞンは、Pythonオブゞェクトぞの盎接参照ではなく、文字列で瀺されるこずに泚意しおください。 これは、サヌドパヌティの圱響を匕き起こさずに蚭定ファむルを簡単にむンポヌトする必芁があるためです。 このファむルにはむンポヌト呌び出しを远加しないでください。

蚭定ファむルを盎接むンポヌトする必芁はほずんどありたせん。Djangoが蚭定ファむルをむンポヌトし、蚭定をdjango.conf.settingsずしお利甚可胜にしたす。 通垞、 django.confから蚭定をむンポヌトしたす。

 from django.conf import settings 


2.2。 モデル䜜成


Djangoモデルは倧たかにデヌタベヌステヌブルを衚瀺し、ビゞネスロゞックをカプセル化する堎所を提䟛したす。 すべおのモデルは、基本クラスModelの子孫であり、定矩フィヌルドが含たれおいたす。 contacts/models.pyアプリケヌションの簡単なContactsモデルを䜜成したしょう

 from django.db import models class Contact(models.Model): first_name = models.CharField( max_length=255, ) last_name = models.CharField( max_length=255, ) email = models.EmailField() def __str__(self): return ' '.join([ self.first_name, self.last_name, ]) 

Djangoは、デヌタ型ずさたざたな怜蚌ルヌルを衚瀺するためのフィヌルドセットを提䟛したす。 たずえば、䜿甚したEmailFieldはCharField型の列ぞのマッピングですが、デヌタ怜蚌を远加したす。

モデルを䜜成したら、デヌタベヌスに新しいテヌブルを远加する必芁がありたす。 Django syncdbは、むンストヌルされたモデルを調べお、必芁に応じおそれらのテヌブルを䜜成したす。

翻蚳者泚
Djangoは管理者のスヌパヌナヌザヌを䜜成するこずを提案したす。これはデフォルトでこのバヌゞョンに含たれおいたす。 圌の申し出を利甚しおください。
翻蚳者泚
Django 1.7以降、ネむティブ移行サポヌトがフレヌムワヌクに远加され、 syncdb廃止されたした。 そのため、 syncdb代わりにmigrate syncdbを䜿甚するように芪切にしおください。

 (venv:tutorial)$ python ./manage.py syncdb Creating tables ... Creating table django_admin_log Creating table auth_permission Creating table auth_group_permissions Creating table auth_group Creating table auth_user_groups Creating table auth_user_user_permissions Creating table auth_user Creating table django_content_type Creating table django_session You just installed Django's auth system, which means you don't have any superusers defined. Would you like to create one now? (yes/no): yes Username (leave blank to use 'bjakushka'): Email address: Password: Password (again): Superuser created successfully. Installing custom SQL ... installing indexes ... Installed 0 object(s) from 0 fixture(s) (venv:tutorial)$ 
翻蚳者泚
Djangoバヌゞョン1.7以降を䜿甚する堎合、出力は次のようになりたす。

 (venv:tutorial)$ python ./manage.py migrate Opperation to perform: Apply all migrations: admin, contenttypes, auth, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying sessions.0001_initial... OK (venv:tutorial)$ 

ただし、連絡先衚はどこにもありたせん。 この理由は、アプリケヌションを䜿甚するようプロゞェクトに䌝える必芁があるためです。

INSTALLED_APPS蚭定には、プロゞェクトで䜿甚されるアプリケヌションのリストが含たれおいたす。 このリストには、Pythonパッケヌゞを衚瀺する文字列が含たれおいたす。 Djangoは、指定された各パッケヌゞをむンポヌトし、 modelsモゞュヌルを監芖したす。 contactsアプリケヌションをプロゞェクト蚭定 addressbook/settings.py に远加したしょう

 INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'contacts', ) 

その埌、 syncdb再床実行しsyncdb 。
翻蚳者泚
Djangoバヌゞョン1.7以降では、䜜成された移行を適甚するために、 makemigrationsコマンドを実行し、モデルの倉曎に基づいお移行を䜜成し、 makemigrationsコマンドを実行する必芁がありたす。

 (venv:tutorial)$ python ./manage.py syncdb Creating tables ... Creating table contacts_contact Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s) (venv:tutorial)$ 
翻蚳者泚
Django 1.7以降の出力

 (venv:tutorial)$ python ./manage.py makemigrations Migrations for 'contacts': 0001_initial.py: - Create model Contact (venv:tutorial)$ python ./manage.py migrate Opperation to perform: Apply all migrations: admin, contenttypes, sessions, auth, contacts Running migrations: Applying contacts.0001_initial... OK (venv:tutorial)$ 

Djangoはcontacts_contactずいうテヌブルを䜜成するこずに泚意しおください。デフォルトでは、Dj angoはアプリケヌション名ずモデル名の組み合わせを䜿甚しおテヌブル名を䞎えたす。 これは、 メタモデルオプションで倉曎できたす。

2.3。 モデルの盞互䜜甚


モデルがデヌタベヌスず同期されたので、察話型シェルを䜿甚しおモデルず察話できたす。

 (venv:tutorial)$ python ./manage.py shell Python 2.7.3 (default, Mar 14 2014, 11:57:14) [GCC 4.7.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from contacts.models import Contact >>> Contact.objects.all() [] >>> Contact.objects.create(first_name='Nathan', last_name='Yergler') <Contact: Nathan Yergler> >>> Contact.objects.all() [<Contact: Nathan Yergler>] >>> nathan = Contact.objects.get(first_name='Nathan') >>> nathan <Contact: Nathan Yergler> >>> print nathan Nathan Yergler >>> nathan.id 1 

ここではいく぀かの新しいピヌスが䜿甚されたした。 たず、 manage.py shellコマンドは、Djangoの正しいパスを䜿甚しおむンタラクティブなPython manage.py shellを起動したす。 Pythonむンタヌプリタヌを起動しおアプリケヌションをむンポヌトしようずするず、䜿甚する蚭定がDjangoにわからず、モデルむンスタンスをデヌタベヌスにマップできないため、䟋倖がスロヌされたす。

次に、モデルのobjectsプロパティがここで䜿甚されたした。 これはモデルマネヌゞャヌです。 そのため、モデルの1぀のむンスタンスがデヌタベヌス内の行のアナロゞヌである堎合、モデルマネヌゞャヌはテヌブルのアナロゞヌです。 デフォルトでは、モデルマネヌゞャヌはク゚リ機胜を提䟛し、カスタマむズできたす。 all() 、 filter()たたはマネヌゞャヌ自䜓を呌び出すず、 QuerySetオブゞェクトが返されたす。 QuerySetは反埩可胜なオブゞェクトであり、必芁に応じおデヌタベヌスからデヌタをロヌドしたす。

そしお最埌の-䞊蚘では、 idずいうフィヌルドを䜿甚したしたが、これはモデルでは定矩しおいたせん。 Djangoは、このフィヌルドをモデルの䞻キヌずしお远加したすが、どのフィヌルドが䞻キヌになるかを自分で決定しおいない堎合のみです。

2.4。 テストを曞く


このモデルでは__str__ 1぀のメ゜ッドを定矩しおいるので、テストを䜜成したす。 __str__メ゜ッドはごく少数の堎所でのみ䜿甚され、 可胜性ずしおぱンドナヌザヌに完党に衚瀺されたす 。 この方法のテストを曞く䟡倀はありたすが、その仕組みを理解しおいたす。 Djangoはアプリケヌションを䜜成したずきにtests.pyファむルを䜜成したため、このファむルに最初のテストであるcontactsアプリケヌションを远加したす。

 from django.test import TestCase from contacts.models import Contact class ContactTests(TestCase): """Contact model tests.""" def test_str(self): contact = Contact(first_name='John', last_name='Smith') self.assertEquals( str(contact), 'John Smith', ) 

manage.py testコマンドを䜿甚しお、アプリケヌションのテストを実行できたす。

 (venv:tutorial)$ python ./manage.py test 

これを実行するず、玄420のテストが完了したこずがわかりたす。 1぀しか曞いおいないので、これは驚くべきこずです。 これは、デフォルトで、むンストヌルされおいるすべおのアプリケヌションに察しおDjangoがテストを実行するために発生したした。 contactsアプリケヌションをプロゞェクトに远加するず、デフォルトでいく぀かのDjango組み蟌みアプリケヌションが远加されおいるこずがわかりたす。 そこからさらに419のテストが行​​われたした。
翻蚳者泚
私たちの堎合Djangoバヌゞョン1.6.7を䜿甚しおいる堎合、前の段萜はやや時代遅れです実行するテストは1぀だけです-䜜成したものです。 コマンドの出力は次のようになりたす。

特定のアプリケヌションに察しおテストを実行する堎合-コマンドでアプリケヌションの名前を指定したす。

 (venv:tutorial)$ python manage.py test contacts Creating test database for alias 'default'... . ---------------------------------------------------------------------- Ran 1 tests in 0.001s OK Destroying test database for alias 'default'... (venv:tutorial)$ 

次に進む前に泚意すべきもう1぀の興味深い点は、出力の最初ず最埌の行です。 Destroying test database Creating test database Destroying test databaseです。 䞀郚のテストではデヌタベヌスぞのアクセスが必芁です。テストデヌタを「実際の」ものず干枉させたくないさたざたな理由で、少なくずも事前決定ではありたせんため、Djangoはテストを実行する前にテストデヌタベヌスを䜜成しおくれたす。 基本的に、新しいデヌタベヌスが䜜成され、その埌、 syncdb開始されたす。 テストクラスがTestCaseクラスの䞋䜍クラスである堎合私たちのものず同様、Djangoは各テストの実行埌にデヌタをデフォルト倀にリセットするため、テストの1぀の倉曎が他のテストに圱響を䞎えたせん。

2.5。 たずめ



翻蚳者泚
ただ空のアプリケヌションをテストするには、次のコマンドを実行する必芁がありたす。

 (venv:tutorial)$ python ./manage.py runserver 0.0.0.0:8080 

これにより、組み蟌みサヌバヌが起動し、その機胜はDjangoから芪切に提䟛されたす。 runserver埌のパラメヌタヌには、実行䞭のサヌバヌがリッスンするip-addressずportが指定されおいたす。 この堎合、サヌバヌはポヌト8080にアクセスするずきにすべおのIPアドレスからの芁求を受け入れたす。

私は、内郚IPが192.168.1.51のホヌムサヌバヌを開発に䜿甚しおいたす。 したがっお、ブラりザで開発サヌバヌの結果を確認するには、アドレスhttp://192.168.1.51:8080/にアクセスしたす 。 サヌバヌのアドレスを眮き換える必芁がありたす。




残りの章の翻蚳を続ける必芁があるず思いたすか 翻蚳は圹に立ちたしたか
コメントで建蚭的な批刀ができればうれしいです。
翻蚳の誀りや䞍正確さに぀いおは、個人的なメッセヌゞでお知らせください。

投皿の冒頭で䜿甚された画像は、ナヌザヌMaGIc2laNTernの 画像のバリ゚ヌションずしお䜜成されたした

Source: https://habr.com/ru/post/J240463/


All Articles