DjangoDjangoを使い始める


備考

Djangoは、「デッドラインを持つ完璧主義者のためのWebフレームワーク」として宣伝しています。「Djangoにより、より迅速かつより少ないコードでより良いWebアプリケーションを構築することが容易になります。それはMVCアーキテクチャと見ることができます。そのコアには以下のものがあります:

  • 開発とテストのための軽量でスタンドアロンのWebサーバー
  • HTMLフォームとデータベースの格納に適した値を変換できるフォームのシリアライゼーションと検証システム
  • オブジェクト指向プログラミングから借用された継承の概念を利用するテンプレートシステム
  • リクエスト処理のさまざまな段階で介入してカスタム関数を実行できるミドルウェアクラスをサポートする、いくつかのキャッシュメソッドのいずれかを使用できるキャッシングフレームワーク
  • アプリケーションのコンポーネントが事前定義された信号を介して相互にイベントを通信することを可能にする内部ディスパッチャシステム
  • Django自身のコンポーネントをさまざまな言語に翻訳するなどの国際化システム
  • DjangoモデルインスタンスのXMLおよび/またはJSON表現を生成して読み込むことができるシリアライゼーションシステム
  • テンプレートエンジンの機能を拡張するためのシステム
  • Pythonのユニットテストフレームワークに組み込まれたインタフェース

バージョン

バージョン発売日
1.11 2017-04-04
1.10 2016-08-01
1.9 2015-12-01
1.8 2015-04-01
1.7 2014-09-02
1.6 2013-11-06
1.5 2013-02-26
1.4 2012-03-23
1.3 2011-03-23
1.2 2010-05-17
1.1 2009年7月29日
1.0 2008-09-03

完全なこんにちは世界の例。

ステップ1すでにDjangoがインストールされている場合は、この手順をスキップできます。

pip install Django
 

ステップ2新しいプロジェクトを作成します

django-admin startproject hello
 

これにより、 hello という名前のフォルダが作成され、次のファイルが作成されます。

hello/
├── hello/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py
 

インサイドステップ3 hello モジュール(含むフォルダ__init.py__ )ファイルを作成するには呼ばviews.py

hello/
├── hello/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── views.py  <- here
│   └── wsgi.py
└── manage.py
 

次の内容を記入してください:

from django.http import HttpResponse

def hello(request):
    return HttpResponse('Hello, World')
 

これはビュー機能と呼ばれます。

ステップ4 hello/urls.py を次のように編集します。

from django.conf.urls import url
from django.contrib import admin
from hello import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.hello)
]
 

ビュー関数hello() をURLにリンクします。

ステップ5サーバを起動します。

python manage.py runserver
 

ステップ6

ブラウザーでhttp://localhost:8000/ を参照すると、以下が表示されます。

こんにちは世界

Dockerをサポートするデプロイに適したプロジェクト。

デフォルトのDjangoプロジェクトテンプレートはうまくいきますが、コードをデプロイするとdevopがプロジェクトに手を置くなどしてしまいます。あなたができることは、あなたのリポジトリに存在する必要がある残りのものとソースコードを分けることです。

GitHub上で使用可能なDjangoプロジェクトテンプレートを見つけることができます。

プロジェクトの構造

PROJECT_ROOT
├── devel.dockerfile
├── docker-compose.yml
├── nginx
│   └── project_name.conf
├── README.md
├── setup.py
└── src
    ├── manage.py
    └── project_name
        ├── __init__.py
        └── service
            ├── __init__.py
            ├── settings
            │   ├── common.py
            │   ├── development.py
            │   ├── __init__.py
            │   └── staging.py
            ├── urls.py
            └── wsgi.py
 

私は維持したいservice 名前のディレクトリservice 、私は同じ使用できるように、すべてのプロジェクトのおかげためDockerfile すべての私のプロジェクトで。要件と設定の分割は、すでにここで十分に文書化されています。
複数の要件ファイルの使用
複数の設定を使用する

ドッカーファイル

開発者だけがDockerを使用するという前提で(すべての開発者が最近信頼しているわけではありません)。これは、 devel.dockerfile 環境devel.dockerfile である可能性があります:

FROM python:2.7
ENV PYTHONUNBUFFERED 1

RUN mkdir /run/service
ADD . /run/service
WORKDIR /run/service

RUN pip install -U pip
RUN pip install -I -e .[develop] --process-dependency-links

WORKDIR /run/service/src
ENTRYPOINT ["python", "manage.py"]
CMD ["runserver", "0.0.0.0:8000"]
 

要件の追加だけでビルド中のDockerキャッシュが活用されます。要件の変更を再構築するだけで済みます。

作成する

Dockerの作成は、特にローカルで実行する複数のサービスがある場合に便利です。 docker-compose.yml

version: '2'
services:
  web:
    build:
      context: .
      dockerfile: devel.dockerfile
    volumes:
      - "./src/{{ project_name }}:/run/service/src/{{ project_name }}"
      - "./media:/run/service/media"
    ports:
      - "8000:8000"
    depends_on:
      - db
  db:
    image: mysql:5.6
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE={{ project_name }}
  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - "./nginx:/etc/nginx/conf.d"
      - "./media:/var/media"
    depends_on:
      - web
 

Nginx

あなたの開発環境は可能な限り環境に近いものでなければならないので、最初からNginxを使いたいと思っています。次に、nginxの設定ファイルの例を示します。

server {
    listen   80;
    client_max_body_size 4G;
    keepalive_timeout 5;

    location /media/ {
        autoindex on;
        alias /var/media/;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_pass http://web:8000/;
    }
}
 

使用法

$ cd PROJECT_ROOT
$ docker-compose build web  # build the image - first-time and after requirements change
$ docker-compose up  # to run the project
$ docker-compose run --rm --service-ports --no-deps  # to run the project - and be able to use PDB
$ docker-compose run --rm --no-deps <management_command>  # to use other than runserver commands, like makemigrations
$ docker exec -ti web bash  # For accessing django container shell, using it you will be inside /run/service directory, where you can run ./manage shell, or other stuff
$ docker-compose start  # Starting docker containers
$ docker-compose stop  # Stopping docker containers
 

Djangoの概念

django-adminは、Djangoに付属しているコマンドラインツールです。 Djangoプロジェクトを始めて管理するための便利なコマンドいくつか付属しています 。このコマンドは./manage.py と同じですが、プロジェクトディレクトリにある必要はありません。 DJANGO_SETTINGS_MODULE 環境変数を設定する必要があります。

DjangoプロジェクトはDjango設定ファイルを含むPythonコードベースです。 Django管理者は、 django-admin startproject NAME コマンドを使ってプロジェクトを作成することができます。プロジェクトには通常、トップレベルにmanage.py というファイルがあり、 urls.py というルートURLファイルがあります。 manage.pydjango-admin プロジェクト特有のバージョンで、そのプロジェクトで管理コマンドを実行することができます。たとえば、プロジェクトをローカルで実行するには、 python manage.py runserver 使用します。プロジェクトはDjangoアプリで構成されています。

Djangoアプリケーションは、モデルファイル(デフォルトではmodels.py )と、アプリケーション固有のURLやビューなどのその他のファイルを含むPythonパッケージです。アプリケーションは、 django-admin startapp NAME コマンドで作成できます(このコマンドはプロジェクトディレクトリ内から実行する必要があります)。アプリをプロジェクトの一部にするには、 settings.py INSTALLED_APPS リストにそのアプリが含まれている必要がありsettings.py 。あなたが標準的な構成を使用した場合、Djangoはのようなもの扱うプリインストールされ、それ自身のアプリケーションのいくつかのアプリケーションが付属して認証を 、あなたのために。アプリケーションは複数のDjangoプロジェクトで使用できます。

Django ORMmodels.py で定義されたデータベースモデルをすべて収集し、それらのモデルクラスに基づいてデータベーステーブルを作成します。これを行うには、まず、 settings.py DATABASES 設定を変更してデータベースをセットアップしsettings.py 。次に、 データベースモデルを定義したら、 python manage.py makemigrations 実行し、続いてpython manage.py migrate を実行して、モデルに基づいてデータベースのスキーマを作成または更新します。

単一ファイルのHello Worldの例

この例は、DjangoでHello Worldページを作成するための最小限の方法を示しています。これは、 django-admin startproject example コマンドが基本的にフォルダとファイルの束を作成し、プロジェクトを実行するために必ずしもその構造体が必要というわけではないことに気付くでしょう。

  1. file.py というfile.py ファイルを作成します。

  2. そのファイルに次のコードをコピーして貼り付けます。

     import sys
     
     from django.conf import settings
     
     settings.configure(
         DEBUG=True,
         SECRET_KEY='thisisthesecretkey',
         ROOT_URLCONF=__name__,
         MIDDLEWARE_CLASSES=(
             'django.middleware.common.CommonMiddleware',
             'django.middleware.csrf.CsrfViewMiddleware',
             'django.middleware.clickjacking.XFrameOptionsMiddleware',
         ),
     )
     
     from django.conf.urls import url
     from django.http import HttpResponse
     
     # Your code goes below this line.
    
     def index(request):
         return HttpResponse('Hello, World!')
    
     urlpatterns = [
         url(r'^$', index),
     ]
    
     # Your code goes above this line
     
     if __name__ == "__main__":
         from django.core.management import execute_from_command_line
     
         execute_from_command_line(sys.argv)
     
  3. ターミナルに行き、このコマンドでpython file.py runserver コマンドを実行します。

  4. ブラウザを開き、 127.0.0.1:8000に進みます。

プロジェクトの開始

DjangoはPythonに基づくWeb開発フレームワークです。 Djangoの1.11(最新の安定版リリース)がインストールされているのPython 2.7、3.4、3.5または3.6が必要です。 pip が利用可能であると仮定すると、インストールは次のコマンドを実行するのと同じくらい簡単です。以下に示すバージョンを省略すると、djangoの最新バージョンがインストールされることに注意してください。

$ pip install django
 

特定のバージョンのdjangoをインストールするには、バージョンがdjango 1.10.5であると仮定して、次のコマンドを実行します。

$ pip install django==1.10.5
 

Djangoを使用して構築されたWebアプリケーションは、Djangoプロジェクト内に存在する必要があります。 django-admin コマンドを使用して、現在のディレクトリで新しいプロジェクトを開始することができます:

$ django-admin startproject myproject
 

ここで、 myproject はプロジェクトを一意に識別する名前で、 数字文字 、およびアンダースコアで構成できます。

これにより、次のプロジェクト構造が作成されます。

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

アプリケーションを実行するには、開発サーバーを起動します

$ cd myproject
$ python manage.py runserver
 

サーバーが稼動しているので、Webブラウザでhttp://127.0.0.1:8000/ にアクセスしてください。次のページが表示されます。

ここに画像の説明を入力

デフォルトでは、 runserver コマンドは、ポート8000 内部IP上で開発サーバーを開始します。このサーバーは、コードを変更すると自動的に再開します。しかし、新しいファイルを追加する場合は、手動でサーバーを再起動する必要があります。

サーバーのポートを変更する場合は、コマンドライン引数として渡します。

$ python manage.py runserver 8080
 

サーバーのIPを変更する場合は、ポートと一緒にそれを渡します。

$ python manage.py runserver 0.0.0.0:8000
 

runserver はデバッグビルドとローカルテストのためのものです。特別なサーバープログラム(Apacheなど)は、常にプロダクションで使用する必要があります。

Djangoアプリケーションを追加する

Djangoプロジェクトには通常、複数のapps が含まれていapps 。これは、プロジェクトを小規模で整備可能なモジュールに構造化する単なる方法です。アプリケーションを作成するには、あなたのプロジェクトフォルダ( manage.py )に移動し、 startapp コマンドを実行します(必要に応じてmyappを変更します)。

python manage.py startapp myapp
 

これにより、 myappフォルダといくつかの必要なファイル( models.pyviews.py など)が生成されます。

Djangoにmyappを認識させるために、 settings.py それを追加してください:

# myproject/settings.py

# Application definition
INSTALLED_APPS = [
    ...
    'myapp',
]
 

Djangoプロジェクトのフォルダ構造は好みに合わせて変更することができます。フォルダー名の繰り返しを避けるため、プロジェクトフォルダーの名前が/src に変更されることがあります。典型的なフォルダ構造は次のようになります。

ディレクトリ構造

仮想環境

厳密には必須ではありませんが、プロジェクトを「仮想環境」で開始することを強くお勧めします。仮想環境とは、特定のバージョンのPythonと一連のモジュール(依存関係)を保持し、オペレーティングシステムのネイティブPythonや他のプロジェクトと同じコンピュータ上で干渉しないコンテナ (ディレクトリ)です。

作業中のプロジェクトごとに異なる仮想環境を設定することで、さまざまなバージョンのPythonでさまざまなDjangoプロジェクトを実行でき、矛盾することなく独自の依存関係を維持できます。

Python 3.3以降

Python 3.3以降には、標準のvenv モジュールが含まれています。通常、これはpyvenv として呼び出すことができます。 pyvenv コマンドが利用できない環境では、 python3 -m venv としてモジュールを直接呼び出すことで同じ機能にアクセスできます。

仮想環境を作成するには:

$ pyvenv <env-folder>
# Or, if pyvenv is not available
$ python3 -m venv <env-folder>
 

Python 2

Python 2を使用している場合は、最初にpipから別のモジュールとしてインストールできます。

$ pip install virtualenv
 

代わりにvirtualenv コマンドを使用して環境を作成します。

$ virtualenv <env-folder>
 

有効化(任意のバージョン)

仮想環境が設定されました。それを使用するには、使用する端末で有効にする必要があります。

仮想環境(任意のPythonバージョン)を '有効にする'には、

Linuxのような:

$ source <env-folder>/bin/activate
 

Windowsのような:

<env-folder>\Scripts\activate.bat
 

これにより、仮想環境がアクティブであることを示すプロンプトが変更されます。 (<env-folder>) $

これ以降、 pip を使用してインストールされたものは、システム全体ではなく仮想envフォルダにインストールされます。

仮想環境のままにするには、 deactivate

(<env-folder>) $ deactivate
 

代わりに:virtualenvwrapperを使う

virtualenvwrapperを使って、virtualenvの作成とアクティベーションを非常に便利にしたり、コードから分離したりすることも考えられます:

# Create a virtualenv
mkvirtualenv my_virtualenv

# Activate a virtualenv
workon my_virtualenv

# Deactivate the current virtualenv
deactivate
 

代わりに:pyenv + pyenv-viritualenv

複数のPythonバージョンを扱う必要がある環境では、virtualenvとpyenv-virtualenvの恩恵を受けることができます。

# Create a virtualenv for specific Python version
pyenv virtualenv 2.7.10 my-virtual-env-2.7.10

# Create a vritualenv for active python verion
pyenv virtualenv venv34

# Activate, deactivate virtualenv
pyenv activate <name>
pyenv deactivate
 

virtualenvsを使用する場合は、 postactivate スクリプトPYTHONPATHDJANGO_SETTINGS_MODULE を設定すると便利です。

#!/bin/sh
# This hook is sourced after this virtualenv is activated

# Set PYTHONPATH to isolate the virtualenv so that only modules installed
# in the virtualenv are available
export PYTHONPATH="/home/me/path/to/your/project_root:$VIRTUAL_ENV/lib/python3.4"

# Set DJANGO_SETTINGS_MODULE if you don't use the default `myproject.settings`
# or if you use `django-admin` rather than `manage.py`
export DJANGO_SETTINGS_MODULE="myproject.settings.dev"
 

プロジェクトパスを設定する

プロジェクトパスをベース<env-folder> ある特別な.project ファイルの中に設定することもしばしば役に立ちます。これを行うと、仮想環境をアクティブにするたびにアクティブディレクトリが指定されたパスに変更されます。

<env-folder>/.project という名前の新しいファイルを作成します。ファイルの内容は、プロジェクトディレクトリのパスにする必要があります。

/path/to/project/directory
 

次に、仮想環境を開始します( source <env-folder>/bin/activate またはworkon my_virtualenv を使用します)。端末は/path/to/project/directory ます。