Pythonでウェブアプリを作りたい:Django編

動機
日曜大工的にやりたいことを思いついて,ウェブでアプリとして動かしたい.
やりたいことを実現するためのライブラリがPythonインターフェイスがある.
最近はPythonに慣れてきたこともある.
方針
Pythonのウェブアプリ開発フレームワークについて理解してウェブアプリを開発する.
ただし,あくまで日曜大工的にやる.

最終的に「データベース使わないならDjangoじゃなくてFlaskの方がよさそう」という結論になった.
はい,クローズ.

Pythonのウェブアプリ開発フレームワークも色々あるらしい.
Djangoが充実しているようで,2005年から開発されてて開発元もそう簡単には潰れなさそうなので,とりあえずこれを使ってみることにする.
環境構築
とりあえず環境構築から始める.
anyenv をインストールして pyenv をインストール,その後
$ pyenv install 3.9.13
$ pyenv local 3.9.13
でpython --version
して,ちゃんとPython 3.9.13
となっているのを確認.
DjangoのQuick install guideを参考にDjangoのインストールをする.
$ python -m pip install Django
これでOKらしい.簡単.
確かにインストールできたか確認する.python
をタイプしてEnterして
>>> import django
>>> print(django.get_version())
4.0.6
となったのでちゃんと動いている模様.

Djangoのtutorialに移動して使い方を理解していく.
- 新たにDjangoプロジェクトを作成する(プロジェクト名
visg
)これで$ django-admin startproject visg
visg
というディレクトリが作成されて,始めるのに必要なファイルが作られた模様.visg
は好きに決めていいらしいが,django
とかtest
にするとconflictが起こるらしい.こわい. - とりあえず動くか確かめてみる.で
$ python manage.py runserver
http://127.0.0.1:8000/
にウェブブラウザでアクセスしてみると,ちゃんと動いているようだ.
Ctrl+c
でキルして終了.
毎回python manage.py runserver
するのも面倒なので,以下のようにプロジェクトディレクトリの一つ上のディレクトリでrun.sh
というshell scriptに書いておく.
#!/bin/zsh
cd visg
python manage.py runserver
chmod +x run.sh
して,必要なときに./run.sh
して止めたくなったらCtrl+c
でキルする.

とりあえず動かし方と確認の方法はわかったので,ここからDjangoの使い方を本格的に学ぶ.
プロジェクトとアプリの関係
さっき作ったのはvisgというプロジェクトで,アプリはこれからプロジェクトの下に作っていくという考えらしい.
プロジェクトの中に複数のアプリがあってもよくて,一つのアプリは複数のプロジェクトに属していてもよいということらしい.
アプリの作り方
とりあえずチュートリアル通りにやってみよう.
polls
というアプリの作り方は
$ cd visg
$ python manage.py startapp polls
で出来る.polls
というディレクトリが作成されて,中に色々入っている.
とりあえずこの段階で,また$ python manage.py runserver
してみて,どうなるか確認してみるも,特に変化なし.
http://localhost:8000/polls/
にアクセスしても404 Page not foundが表示される.
startapp
しただけでは何も動かないということらしい.

アプリの動かし方
チュートリアルにあるように,polls/view.py
というファイルに以下を書き加えてみる.
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
これでもまだhttp://localhost:8000/polls/
にアクセスしてもダメだった.
さらにpolls/urls.py
というファイルを新規で作成して以下を書き込む.
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
まだhttp://localhost:8000/polls/
にアクセスしてもダメ.
さらにさらにvisg/urls.py
を以下のように書き換える.
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
- 元々は
from django.urls import path
だったところに,include
を追加でimportする. -
urlpatterns
の中にpath('polls/', include('polls.urls')),
を追加する.
これでhttp://127.0.0.1:8000/polls/
にアクセスしてみると,Hello, world. You're at the polls index.
という文字列が表示された.
その代わりにhttp://127.0.0.1:8000/
にアクセスしてみたら404 Page not foundになった.なんでだよ.

書き換えたところの意味を理解する
とりあえずチュートリアル通りに書き換えたら,チュートリアル通りの結果が得られた.
- プロジェクトを
django-admin startproject visg
で作ったときに,visg/visg
というディレクトリができていた.
これは,どうもvisgというプロジェクトの下にvisgというアプリが作成されたものと思ってよさそう.
基本的にvisg/visg
というアプリがvisgというプロジェクトでメインに動く感じか. -
python manage.py startapp polls
でアプリvisg/polls
を作成したとしても,アプリvisg/visg
はまだ全然認識できていないらしい. - まず
visg/visg
がvisg/polls
を認識させる方法としてvisg/visg/urls.py
というファイルに「visg/polls
というアプリがありますよ」ということを知らせる必要がある.
それをpath()
で指定するということか.include
のインポートは,付加的な修正だな.
(でも基本的に,visg/visg
から他のアプリを認識させるにはinclude()
するものらしい.) - それから,さらに
visg/polls
アプリの挙動を指定しなければならない.
今回は挙動と言っても,polls/view.py
に「HTTPリクエストがあれば,文字列をレスポンスする」という簡単なものを書いただけ. - 最後に,
visg/polls/urls.py
でURLのさばき方を指定するのかな.
urlpatterns = [path()]
で指定するのは,visg/visg/urls.py
と同じなので,そうっぽい.
うーん,チュートリアルの書き方は変えた方がいいのでは.
path()
関数の使い方
ここで一つ,path()
の使い方をお勉強をする.path(route, view, kwargs, name)
という風に使う.
正確な使い方は引用しておく方が賢明そうなので以下引用.
4つの引数を受け取ります。引数のうち
route
とview
の2つは必須で、kwargs
、name
の2つは省略可能です。
route
引数route は URL パターンを含む文字列です。リクエストを処理するとき、Django は urlpatterns のはじめのパターンから開始し、リストを順に下に見ていきます。要求された URL を一致するものを見つけるまで各パターンと比較します。
パターンはGETやPOSTのパラメーター、そしてドメイン名を検索しません。例えば、 https://www.example.com/myapp/ へのリクエストにおいては、URLconfは myapp/ を見ます。 https://www.example.com/myapp/?page=3 へのリクエストにおいても、URLconfは myapp/ を見ます。
view
引数Django がマッチする正規表現を見つけると、 Django は指定されたビュー関数を呼び出します。その際はHttpRequest オブジェクトを第一引数に、そしてキーワード引数としてrouteから「キャプチャされた」値を呼び出します。この例はこの後すぐ出てきます。
kwargs
引数任意のキーワード引数を辞書として対象のビューに渡せます。
name
引数URL に名前付けをしておけば Django のどこからでも明確に参照でき、とくにテンプレートの中で有効です。この便利な機能のおかげで、プロジェクトのURLにグローバルな変更を加える場合にも1つのファイルを変更するだけで済むようになります。

チュートリアル通りだと,この次はデータベースの作成になる.
でも別にいま作りたいアプリはデータベース使わないと思うので飛ばす.
Django Adminの紹介
http://127.0.0.1:8000/admin/
にアクセスして何かできるらしい.
そのためにまずアカウントの作成をする.
$ python manage.py createsuperuser
を実行して,…と思ったら,
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them.
というエラーが出た.
言われた通りに以下を実行する.
$ python manage.py migrate
何か色々表示されたが全部OKとなったので,OKだろう(適当)

気を取り直して,python manage.py createsuperuser
する.
今度はうまく行ったようなので,Username
とEmail address
とPassword
を適当に入力する.
それからpython manage.py runserver
して,http://127.0.0.1:8000/admin/
にアクセスしてみると,
先ほど入力したユーザ名とパスワードを入れてLog inを押してみると,
このままだとユーザとグループの管理しかできないようだ.
さっき作ったvisg/polls
はどうしたんだ,というお気持ち.
チュートリアルを読み進めてみると,「Poll アプリを admin 上で編集できるようにする」というのがあった.
だが,途中のデータベースの部分の機能を使うらしい.
もうちょっと読み進めてみたが,Django adminを使えばブラウザ上でデータベースを確認・編集できるようになるのか.とりあえずいらない.

どうも調べてみたら,データベースを使わないならDjangoじゃなくてもいいんじゃない?という文章があった.
そうかもしれない…!
ということで,Djangoは一旦やめます.