Djangoチュートリアル:Django2.0を使い始める

Djangoは、Ruby on Railsに触発され、同じメタファーの多くを使用してWeb開発を迅速かつ簡単にする、万能のPythonWebフレームワークです。完全にロードされた柔軟性のあるDjangoは、Pythonで最も広く使用されているWebフレームワークの1つになりました。

Djangoには、あらゆるサイズのWebアプリケーションを構築するために必要な事実上すべてが含まれており、その人気により、例を簡単に見つけて、さまざまなシナリオに役立ちます。さらに、Djangoは、アプリケーションを適切に進化させて機能を追加し、データスキーマ(ある場合)を移行できるようにするツールを提供します。

Djangoは複雑であるという評判もあり、多くのコンポーネントと大量の「内部」構成が必要です。実際、簡単なアプリを比較的短い順序で起動して実行し、必要に応じてそこから機能を拡張できます。

このガイドでは、初歩的なDjango 2.0アプリの作成について説明し、Web開発者に提供する最も重要な機能について簡単に触れます。

Django1.xからのアップグレード

以前の1.xエディションのDjangoを使用した経験がある場合、これらは意識すべき最も重要な重大な変更です。

  • Django2.0はPython3.4以降のみをサポートします。Python 2.xは、Djangoの将来のバージョンではサポートされなくなります。
  • Django 2は、可能な限りネイティブUnicode文字列を使用するPython3のパターンに従います。一部のDjango関数は、入力としてバイト文字列を受け入れなくなりました。 

他にも多くの後方互換性のない変更がありますが、特に新しいプロジェクトを開始する場合、それらは最も重要な2つです。

Djangoのコアライブラリのインストール

Django 2.0をインストールするには、Python3.4以降が必要です。次に、Djangoをインストールする最も簡単な方法は、Pythonのpipユーティリティを使用することです。

pip install django

これにより、コアDjangoライブラリとdjango-adminDjangoプロジェクトの管理に使用されるコマンドラインユーティリティがインストールされます。

複数のバージョンのDjangoを並べて操作する場合は、仮想環境を作成し、そこに目的のバージョンのDjangoをインストールして、問題のDjangoプロジェクトに使用します。

Djangoの単一インスタンスで複数のプロジェクトを作成するために仮想環境を使用する必要はないことに注意してください。 異なるプロジェクトでDjangoフレームワークの異なるポイントリビジョンを使用するために必要なのはそれらだけです。

新しいDjangoプロジェクトの作成

Djangoインスタンスは、プロジェクトアプリの2つの層で構成されています

  • このプロジェクトは、独自のデータベース構成、設定、およびアプリケーションとジャンゴのインスタンスです。プロジェクトは、使用するすべてのサイトレベルの構成を保存する場所と考えるのが最善です。
  • アプリは、独自のルートとレンダリングロジックと、プロジェクトの細分化です。1つのDjangoプロジェクトに複数のアプリを配置できます。 

新しいDjangoプロジェクトを最初から作成するには、プロジェクトを保存するディレクトリを入力し、次のように入力します。

django-admin startproject

ここで、はプロジェクトと、プロジェクトが保存されるサブディレクトリの両方の名前です。PythonまたはDjangoで内部的に使用されている名前と衝突する可能性が低い名前を選択してください。のような名前は問題myprojなく機能します。

結果のディレクトリには manage.py、コマンドラインからアプリの動作を制御するために使用されるファイルと、次のファイルを含む別のサブディレクトリ(プロジェクト名も含む)が含まれている必要があります。

  • __init__.pyPythonが使用されているファイルは、コードモジュールなどのサブディレクトリを指定します。
  • settings.py、プロジェクトに使用される設定を保持します。最も一般的な設定の多くは、事前に入力されています。
  • urls.py、Djangoプロジェクトで利用可能なルートまたはURL、またはプロジェクトが応答を返すルートまたはURLを一覧表示します。
  • wsgi.py、Apache HTTPやNginxなどのWSGI互換Webサーバーが、プロジェクトのアプリを提供するために使用します。

何よりもまず、プロジェクトをテストして、機能していることを確認します。プロジェクトのmanage.pyファイルを含むディレクトリのコマンドラインから、次のコマンドを実行します。

python manage.py runserver

これにより、で利用可能な開発Webサーバーが起動します//127.0.0.1:8000/。そのリンクにアクセスすると、インストールが成功したことを示す簡単なウェルカムページが表示されます。

開発Webサーバーを使用してDjangoプロジェクトを一般に提供することはできません。必要なトラフィックを処理するように拡張することはできません。

Djangoアプリの作成

次に、このプロジェクト内にアプリを作成する必要があります。と同じディレクトリに移動しmanage.py、次のコマンドを発行します。

python manage.py startapp myapp

これによりmyapp 、以下を含むという名前のアプリのサブディレクトリが作成されます。

  • migrationsディレクトリ。データスキーマのバージョン間でサイトを移行するために使用されるコードが含まれています。
  • admin.py。Djangoの組み込み管理ツールで使用されるオブジェクトが含まれています。アプリに管理インターフェースまたは特権ユーザーがある場合は、ここで関連オブジェクトを構成します。
  • apps.py。アプリに関する構成情報を、AppConfigオブジェクトを介してプロジェクト全体に提供します。
  • models.py。アプリがデータベースとのインターフェースに使用するデータ構造を定義するオブジェクトが含まれています。
  • tests.py。サイトの機能とモジュールが意図したとおりに機能していることを確認するために使用されるテストが含まれています。
  • views.py。応答をレンダリングして返す関数が含まれています。

アプリの操作を開始するには、まずアプリをプロジェクトに登録する必要があります。これを行うには、編集myproj/settings.pyしてINSTALLED_APPSリストの一番上に行を追加します。

INSTALLED_APPS = [ ‘myapp.apps.MyappConfig’, ‘django.contrib.admin’, ... 

を見るとmyapp.apps、という名前の事前生成されたオブジェクトが表示されMyappConfigます。これは、ここで参照しているものです。

Djangoアプリにルートとビューを追加する

Djangoアプリは、リクエストを処理するための基本的なパターンに従います。

  • 着信リクエストを受信すると、Djangoはそれを適用するルートのURLを解析します。
  • ルートはで定義されurls.py、各ルートはビューにリンクされています。つまり、クライアントに送り返されるデータを返す関数です。ビューはDjangoプロジェクトのどこにでも配置できますが、独自のモジュールに編成するのが最適です。
  • Views can contain the results of a template, i.e. code that formats requested data according to a certain design.

To get an idea of how all these pieces fit together, let’s modify the default route of our sample app to return a custom message.

Routes are defined in urls.py in a list named urlpatterns. If you open the sample urls.py, you’ll see urlpatterns already predefined:

urlpatterns = [ path(‘admin/’, admin.site.urls), ] 

The path function—a Django built-in—takes a route and a view function as arguments and generates a reference to a URL path. By default, Django creates an admin path that is used for site administration, but we need to create our own routes.

Add another entry, so that the whole file looks like:

from django.contrib import admin from django.urls import include, path urlpatterns = [ path(‘admin/’, admin.site.urls), path(‘myapp/’, include(‘myapp.urls’)) ] 

The include function tells Django to look for more route pattern information in the file myapp.urls. All of the routes found in that file will be attached to the top-level route myapp (e.g., //127.0.0.1:8080/myapp).

Next, create a new urls.py in myapp and add the following:

from django.urls import path from . import views urlpatterns = [ path(‘’, views.index) ] 

Django prepends a slash to the beginning of each URL, so to specify the root of the site (/), we just supply a blank string as the URL.

Now edit the file myapp/views.py so it looks like this:

from django.http import HttpResponse def index(request): return HttpResponse(“Hello, world!”) 

django.http.HttpResponse is a Django built-in that generates an HTTP response from a supplied string. Note that request, which contains the information for an incoming HTTP request, must be passed as the first parameter to a view function.

Stop and restart the development server, and navigate to //127.0.0.1:8000/myapp/. You should see Hello, world! appear in the browser.

Adding routes with variables in Django

Django can accept routes that incorporate variables as part of their syntax. Let’s say you wanted to accept URLs that had the format year/. You could accomplish that by adding the following entry to urlpatterns:

path(‘year/’, views.year) 

The view function views.year would then be invoked through routes like year/1996, year/2010, and so on, with the variable year passed as a parameter to views.year.

To try this out for yourself, add the above urlpatterns entry to myapp/urls.py, then add this function to myapp/views.py:

def year(request, year): return HttpResponse(‘Year: {}’.format(year)) 

If you navigate to /myapp/year/2010 on your site, you should see Year: 2010 displayed in response. Note that routes like /myapp/year/rutabaga will yield an error, because the int: constraint on the variable year allows only an integer in that position. Many other formatting options are available for routes.

Earlier versions of Django had a more complex and difficult-to-parse syntax for routes. If you still need to add routes using the old syntax—for instance, for backward compatibility with an old Django project—you can do so by using the django.urls.re_path function.

Django templates

Django’s built-in template language can be used to generate web pages from data.

Templates used by Django apps are stored in a directory that is central to the project: /templates//. For our myapp project, the directory would be myapp/templates/myapp/. This directory structure may seem a little awkward, but Django can look for templates in multiple places, so this avoids name collisions between templates with the same names across multiple apps.

In your myapp/templates/myapp/ directory, create a file named year.html with the following content:

Year: {{year}} 

Any value within double curly braces in a template is treated as a variable. Everything else is treated literally.

Modify myapp/views.py to look like this:

from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse(“Hello, world!”) def year(request, year): data = {’year’:year} return render(request, ‘myapp/year.html’, data) 

The render function, a Django “shortcut” (a combination of multiple built-ins for convenience), takes the existing request object, looks for the template myapp/year.html in the list of available template locations, and passes the dictionary data to it as context for the template.

The amount of processing you can perform on data within Django templates is intentionally quite limited. Django’s philosophy is to enforce separation of presentation and business logic whenever possible. Thus you can loop through an iterable object, and you can perform if/then/else tests, but modifying the data within a template is frowned upon.

For instance, a simple “if” test can be encoded this way:

{% if year > 2000 %} 21st century year: {{year}} {% else %} Pre-21st century year: {{year}} {% endif %} 

The {% and %} markers delimit blocks of code that can be executed in Django’s template language.

If you want to use a more sophisticated template processing language, you can swap in others, such as Jinja2 or Mako. Django includes back-end integration for Jinja2, but any template language that returns a string can be used—for instance, by returning that string in a HttpResponse object as in the case of our ”Hello, world!” route.

Next steps with Django

What we’ve seen here covers only the most basic elements of a Django application. Django includes a great many other components that can be employed in a web project. All of these are worth discussing in detail separately, but I will leave you with a brief overview:

  • Databases and data models. Django’s built-in ORM can be used to define data structures and relationships between them for your app, as well as migration paths between versions of those structures.

  • フォーム。Djangoは、ビューがユーザーに入力フォームを提供し、データを取得し、結果を正規化し、一貫したエラーレポートを提供するための一貫した方法を提供します。

  • セキュリティとユーティリティ。Djangoには、キャッシュ、ロギング、セッション処理、静的ファイルの処理、およびURLの正規化のための多くの組み込み関数が含まれています。また、暗号化証明書の使用や、クロスサイト偽造保護やクリックジャッキングからの保護など、一般的なセキュリティニーズに対応するツールもバンドルされています。