Django – Hello! – 単純なアプリケーション

概要

特定のURLにアクセスするとブラウザーに”Hello!”とだけ表示させるプロジェクトを作成する。要点は以下の通り。

  • Djangoのプロジェクトは複数のアプリケーションを含むことができる
  • アプリケーション作成はmanage.pystartappオプションで実行
  • リクエストに対応した処理を行うview関数をviews.pyに定義
  • 特定のURLへのアクセスが対応するview関数にルーティングされるよう、urls.pyに設定

仕様

動作は以下の通り。

  • URLにhttp://localhost:8000/helloを指定してリクエスト
  • 文字列"Hello!"を返す(ブラウザーに表示される)

構造は以下の通り。

  • Hello表示のアプリケーションをhelloとする
  • リクエストに対応するview関数をsay_hello()とする
  • say_hello()はリクエストに対して文字列"Hello!"をレスポンスで返す

プロジェクトのスタート

まずgreetingsという名前でディレクトリーを作成し、そのディレクトリー下にプロジェクト作成。ここではサブディレクトリー名をconfigとしている。

プロジェクトの構成は以下の通り。

settings.py編集後にサーバーを起動してDjangoのwelcomeページが表示されることを確認しておく。

ここでのsettings.pyの編集内容は以下の通り。

  • ALLOWED_HOSTSへの追加
  • DATABASESのコメントアウト
  • 言語とタイムゾーンの設定

サーバー起動はVagrantのプライベート環境下なので以下の通り。

ブラウザーからのアクセスはhttp://localhost:8000で。

アプリケーションの作成

アプリケーション作成は、プロジェクトディレクトリー直下(manage.pyのある場所)で以下を実行。

ここでは、ブラウザーに”Hello!”を表示するためのhelloアプリケーションを作成する。greetingsディレクトリー下で以下を実行。

ディレクトリー構成は以下のようになる。新たにhelloディレクトリーが追加されている。

settings.pyにアプリケーションを追加

プロジェクトでhelloアプリケーションを認識するため、settings.pyINSTALLED_APPSにアプリケーション名'hello'を追加。

viewの作成~views.py

リクエストに対応した処理を、helloアプリケーションディレクトリー内のviews.pyファイルに記述。

  • 単純にHTTPレスポンスで文字列を返すため、HttpResponseをインポート
  • view関数としてsay_hello()を定義し、文字列を返すよう記述

ルーティング~urls.py

想定しているURLに対して定義したview関数が呼ばれるようにルーティング。プロジェクトサブディレクトリーのurls.pyファイルに記述を追加する。

  • say_hello()を使うためインポートが必要
  • urlpatterns/helloからsay_hello()へのルーティングを定義

ブラウザーから接続

以下のURLでブラウザーに”Hello!”と表示される。

なお、これ以降localhost:8000のルートに接続すると404エラーとなる。

ルーティングを記述したurls.pyにホストのルートへのルーティングを追加すると、http://localhost:8000のURLに対しても”Hello!”が表示されるようになる。

 

Django – プロジェクトの作成

概要

Djangoのプロジェクト作成はdjango-admin startprojectで行う。新規にプロジェクトディレクトリーを作成する方法と、既存のディレクトリーに作成する方法がある。

新規にプロジェクトディレクトリーを作成する方法では、プロジェクト名のみを指定する。

この場合プロジェクト名と同じディレクトリーが作成され、その下に同じ名前のサブディレクトリーとmanage.pyファイルが作成される。

既存のディレクトリーに作成する方法では、第1引数にサブディレクトリー、第2引数に既存のプロジェクトディレクトリーを指定する。

この場合、既存のプロジェクトディレクトリーの下にサブディレクトリーとmanage.pyファイルが作成される。

何れの場合もサブディレクトリーの内容は同じで、プロジェクト全体に関する設定ファイルなどが作成される。

manage.pyはコマンドラインで管理レベルの操作を行うためのファイル。

プロジェクト名だけを指定する場合

プロジェクト名だけを指定した場合は、その名前でディレクトリーが作成され、その下に同じ名前のサブディレクトリーとmanage.pyファイルが作成される。

もし同じ名前のディレクトリーが既に存在していた場合はエラーとなる。

以下は新規作成されたプロジェクトディレクトリーの内容

サブディレクトリーの下には、プロジェクト全体に関する設定ファイルが作成される。たとえばsettings.pyファイルは、プロジェクトの言語やタイムゾーン、データベースなどに関する設定を記述する。

既存のディレクトリーに作成する場合

空のプロジェクトディレクトリーを作成し、第1引数にサブディレクトリー、第2引数にプロジェクトディレクトリーを指定して実行する。

もし指定したプロジェクトディレクトリーが存在しない場合はエラーになる。

なお、以後の作業をプロジェクトディレクトリー内で行うことを想定して以下のように実行してもよい。

この場合のディレクトリー構成は以下のようになる。

 

 

Django – 初期設定とサーバー起動

概要

主な留意点は以下の通り。

  • DjangoのデフォルトDBMSはSQLite
  • 言語・タイムゾーン・DB設定などはsettings.pyで記述(Laravelの.envに相当)
  • Vagrantなどの仮想環境の場合はサーバー起動のIPに注意
    →ゲスト側でALLOW_HOSTSの設定も必要

当初に発生したエラーと対応についてはこちら

データベースクライアントのインストール

DjangoのデフォルトではSQLiteとなっている。SQLiteの場合は一定以上のバージョンが要求される模様。

他のDBMSを使う場合、クライアントをインストールしておく必要がある。以下はMySQLを使う場合にmysqlclientをインストールした例。

settings.py~各種設定

言語とタイムゾーン

言語を日本語に、タイムゾーンを日本のものに設定。

データベース設定

デフォルトのSQLiteではなくMySQLを使う例

ホスト許可

Vagrantなど仮想環境のプライベートネットワークで接続する場合、ここに設定が必要。

Vagrantの場合

Vagrantfileの設定

ポートマッピング設定。プライベートネットワークはデフォルト。

ゲスト側IP確認

ゲスト側の仮想環境でサーバーを起動する場合のIPを確認。ホスト側では127.0.0.1にセットされている。

開発用Webサーバー起動

ifconfigで確認したゲスト側のIPでサーバーを起動する。

ブラウザーで接続

ホスト側のブラウザーで、http://localhost:8000かhttp://127.0.0.1:8000で接続。

 

Vagrant – Django – サーバーエラー

概要

以下のような流れでエラー発生・解決した記録。データベース接続なしでとにかくDjangoのサーバー起動とアクセスを確認。

  • Vagrant上のCentOS7にPython3やvertualenvをインストール
  • 仮想環境上でDjango開発用サーバーを起動
  • Exception発生
  • ひとまずデータベースを切ってサーバー起動
  • ブラウザーから接続できず
  • Vagrantfileを編集してIPアドレス変更
  • DisallowedHostで接続できず
  • settings.pyのALLOWED_HOSTを編集
  • 無事接続

データベースを繋がずにとにかくDjangoの応答までを確認する場合、Vagrant環境では以下のように設定。

  • Vagrantfileでポートマッピングを設定
  • VMでifconfig→eth0のIPアドレスを確認
  • settings.pyのALLOWED_HOSTSにブラウザーでアクセスしたいホスト名、IPアドレスを追加
  • 開発用Webサーバーをeth0のIPアドレスとマップしたポートで起動
  • ALLOWED_HOSTSで許可したホスト/IPアドレスとマップしたポートでアクセス

サーバー起動時エラー発生

Vagrant/CentOS7環境上にPython3virtualenvをインストールして、仮想環境を作成。その環境下でDjangoをインストール

とりあえずテスト用のプロジェクトを作成。

プロジェクトで開発用Webサーバーを起動しようとしたところ、エラー発生。SQLiteのバージョンが低いと言っているらしい。

SQLiteを確認したところ、3.7と必要なバージョンより確かに低い。

データベース無効化で再挑戦

そもそもデータベースにはSQLiteではなくMySQLを使っている。またとりあえずの動作確認なので、データベースを設定せずにサーバーを起動してみようと考える。

Laravelでいえば.envファイルにあたる設定ファイルは、Djangoではsettings.pyらしい。その場所を探してみるとプロジェクトディレクトリーと同名のサブディレクトリーにあった。

settings.pyの中のデータベース関係を探して、そこをすべてコメントアウトしてみる。

再度サーバーを起動すると、エラー無く実行された。

ブラウザーで接続不可

サーバーは起動されたが、ブラウザーでhttp://127.0.0.1:8000とするとアクセスできない。

Vagrantのプライベートネットワークに沿った設定とサーバー起動が必要なことを忘れていた。

プライベートネットワーク設定

Vagrantfileの内容を確認・編集

vagrant reloadで再起動し、vagrant sshでCentOS7に入り、ポート設定を見る。

ゲスト側のVMからは10.0.20.15でサーバーを立ち上げ、ホスト側では127.0.0.1で接続する。ポートフォワーディングはホスト・ゲストとも8000

開発用Webサーバーを10.0.20.15:8000で起動。

Djangoで許可されない

ブラウザーでhttp://127.0.0.1:8000http://localhost:8000とするが接続できない。ただしDjangoによって許可されていないらしく、ALLOWED_HOSTSを加えるよう示されている。

ALLOW_HOSTSを編集して接続

settings.pyALLOWED_HOSTSを編集。

ブラウザーからhttp://127.0.0.1:8000あるいはhttp://localhost:8000でアクセスでき、以下のページが表示された。

 

 

 

CwntOS7 – Djangoのインストール

概要

Vagrant上のCentOS7にDjangoをインストール。

virtualenvの仮想環境でインストールした場合、元のシステムには影響を与えない。

手順

Python3インストール済みの環境でDjangoをインストール。特に問題なくインストール完了。

バージョンチェック。

Python3からもチェック。

 

Linux – bash – シェルプロンプトの変更

プロンプトの書式の確認

Vagrant上のCentOS7でシェルはbash。プロンプトは以下のようになっている。

この書式はPS1変数で設定されている。

それぞれの意味は以下の通り。

  • \u:ユーザー名
  • \h:ホスト名
  • \W:カレントディレクトリー

プロンプトの変更例

$#だけにする

プロンプトの後にスペースを入れておく。

ユーザー名と時刻にする

一部に色を付ける

以下はユーザー名と時刻を表示して、ユーザー名を青にしている(ターミナルではvagrantが青で表示される)。

常時設定する

~/.bashrcexport文を加える。

プロンプト書式に使える記号

以下の記号が使える。

  • \d:日付
  • \h:ホスト名の最初のブロック
  • \H:ドメイン名まで含めたホスト名
  • \s:シェルの名前
  • \t:時間~24時間制
  • \T:時間~12時間制
  • \@:時間~AM/PM形式
  • \u:ユーザー名
  • \w:カレントディレクトリー
  • \W:カレントディレクトリーのベース名
  • \!:コマンドの履歴番号
  • \$:一般ユーザーは$、rootなら#
  • \\:バックスラッシュ

色の設定

色設定はエスケープシーケンスで行う。

  • 設定開始:[ESC]+'['+[色コード]+'m'
  • 設定解除:[ESC]+'['+'39'+'m'

色コードには前景色と背景色がある。

  • 前景色:30~37、90~97
    • 90~97は明るめの色
  • 背景色:40~47
    • 100~107は明るめの色
  • 拡張指定:38
    • 256カラーレベル:38;5;n、48 ;5;n
    • RGB指定:38;2;r;g;b、48;2;r;g;b
  • 色設定解除:39
前景色 背景色
Black 30 40
Red 31 41
Green 32 42
Yellow 33 43
Blue 34 44
Magenta 35 45
Cyan 36 46
White 37 47

 

Vagrant – CentOS7 – Python3 – virtualenv

概要

Vagrant上のCentOS7で、virtualenvをインストールしてPython3の仮想環境をつくった手順の記録。

  • pipvirtualenvwrapperをインストールする
  • sudoでインストールすると警告が出てグローバルにインストールされる

許可がなくインストールできない

pip3virtualenvwrapperをインストールしようとしたところ、許可がないとエラーになった。

ディレクトリーに書き込み権限がない。

sudoで警告が出るがインストール

以下のような警告が出るが、インストールは実行される。

WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install –user` instead.

グローバルインストールするのに対して、--userオプションでユーザーディレクトリーへのインストールを促している。

確認

virtualenvのバージョン確認。

仮想環境構築の確認。

ディレクトリー確認。

仮想環境の有効化。

仮想環境の無効化と削除。

操作

基本操作

ディレクトリーを作成して仮想環境を作成。絶対パスでなければ現在のディレクトリー下に作成される。

$ virtualenv directory

仮想環境の有効化。

$ source directory/bin/activate
または
$ . directory/bin/activate

仮想環境の無効化。

(directory) $ deactivate

仮想環境の削除

$ rm -rf directory

応用

Pythonのバージョン指定

$ virtualenv -p python3.6 directory

システムのPythonパッケージ群を仮想環境からも参照

$ virtualenv --system-site-packages directory

virtualenvwrapperの利用

.bashrcの編集と再読み込み

virtualenvだけでも基本的な操作はできるが、virtualenvwrapperを利用すると便利なコマンドが使えるようになる。そのために~/.bashrcに以下の3行を加える。

.bashrcを実行して反映させる。

1行目のWORKON_HOMEで指定したディレクトリーが作成され、ここに仮想環境ごとのディレクトリーが作成される。

2行目を設定しないと以下のエラーが出る。エラーが出てもvirtualenvwrapperは利用できたが入れておく。

3行目はvirtualenvwrapper.shを実行させる。

.bashrcの実行後、~/.virtualenvsディレクトリーと必要なファイルが作成される。

確認

仮想環境を作ってみる。

python3の場所が仮想環境内になっていて、元のシステムの場所とは違う。

もう一つ仮想環境を作って、workonコマンドで見てみる。lsvirtualenvコマンドもあるが、workonコマンドとの違いがよくわからない。

仮想環境にモジュールをインストールしてもシステムに影響がないことを確認する。まずシステムにはNumpyモジュールがインストールされていないことを確認。

仮想環境でもNumpyはインストールされていない。

Python3をexit()で抜けて、仮想環境のコマンドラインでNumpyをインストール。

Python3でNumpyが使えるようになった。

Python3をexit()で抜けて、仮想環境からも抜ける。元の環境ではNumpyはインストールされていないことがわかる。

virtualenvwrapperのコマンド

仮想環境の作成・有効化。WORKON_HOMEで設定したディレクトリーに作成される。

$ mkvirtualenv envname

仮想環境の無効化。

(envname) $ deactivate

仮想環境の一覧。

$ workon
または
$ lsvirtyalenv -b/-l

仮想環境の有効化。

$ workon envname

仮想環境ディレクトリーへの移動。

$ cdvirtualenv envname

仮想環境の削除。

$ rmvirtualenvname envname

 

Vagrant – CentOS7 – Python3インストール

概要

Vagrant上のCentOS7にPython3をインストールした記録。

要点は以下の通り。

  • IUSのリポジトリーでインストール
  • --enablerepo=iusが必要

バージョン確認

まずPythonのバージョンを確認する。

一応Python2の動作確認。

Python3はインストールされていない。

IUSのリポジトリー追加

リポジトリー追加ができない。

リポジトリーは作成できている。

GitをインストールしたときにIUSのリポジトリーをインストールしていたのを忘れていた。

Python3がインストールできない

Python3.6をインストールしようとするができない。

/etc/yum.repos.d/ius.repoの設定でenabled = 0になっているため。Gitのインストールの時に書き換えているが、毎回元に戻るのか?

オプション設定でインストール成功

設定ファイルを書き換えてもよいが、yum実行時のオプションで--enablerepo=iusを追加して成功。

確認

バージョン確認。

動作確認。

Python2ではない。

python3の場所。

pipのバージョン確認。

 

オイラー関数

定義

オイラーのトーシェント関数、オイラーのφ関数とも。totientとは数学用語で「与えられた数以下でこれと素な整数の個数」というこの関数の意味そのもの。

φ(6) = 2 (1, 5)

φ(12) = 4 (1, 5, 7, 11)

φ(20) = 8 (1, 3, 7, 9, 11, 13, 17, 19)

素数に対するオイラー関数値

素数はそれ自身と1以外に約数を持たないので、オイラー関数値はその値から自身の分1を減じた値となる。

φ(p) = p − 1 

2つの素数の積のオイラー関数値は、双方から1を減じた値の積になる。

φ(pq) = (p − 1)(q − 1)

これを納得するのに時間がかかった。まどろっこしいが以下のように考えた。

まず以下のことに気づく。

(1)    \begin{equation*} (p - 1)(q - 1) = pq - p - q + 1 = pq - (p - 1) - (q - 1) - 1 \end{equation*}

次に2つの素数5と3で以下のように考えてみる。

まずφ(15)に関して。15以下の数のうち15と互いに素であるのは以下の8個。

1, 2, 4, 7, 8, 11, 13, 14

逆に互いに素でない(15と公約数を持つ)数は以下の6個。

3, 5, 6, 9, 10, 12

ここで以下のように考える。

  • φ(5)に関してはカウントされる数は1, 2, 3, 4の4つで、φ(3)に関してはカウントされる数は1, 2の2つ
  • これらの数に任意の自然数を掛けて15以下の自然数を作り出すことができる
  • ところが3×5は素数の掛け算であり、上記の数に3や5以外の数をかけてもその結果は3×5と互いに素であることに変わりはない
  • φ(3)でカウントする1, 2に対して5を掛ければ、3×5以下でこれと互いに素でない数が得られる
  • またφ(5)でカウントする1, 2, 3, 4に対して3を掛ければ、3×5以下でこれと互いに素でない数が得られる
  • しかも3と5はいずれも素数で互いに素なので、上記の結果に重複は生じない

φ(3)に関しては、対象となる数に5を掛けて以下が得られる。

1, 2 → 5, 10

φ(5)に関しては、対象となる数に3を掛けて以下が得られる。

1, 2, 3, 4 → 3, 6, 9, 12

以上を併せて、15に対して1を除いて互いに素でない6個の数が得られる。

すなわち、φ(pq)は以下のようにして得られる。

  • 重複しないp − 1個、q − 1個の数がpqと互いに素でない
  • pq自身1個もpqと互いに素でない

したがって以下のようになる。

(2)    \begin{equation*} \phi (pq) = pq - (p - 1) - (q - 1) - 1 = (p - 1)(q - 1) \end{equation*}