Closed10

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

Junji FujimotoJunji Fujimoto

動機

日曜大工的にやりたいことを思いついて,ウェブでアプリとして動かしたい.
やりたいことを実現するためのライブラリがPythonインターフェイスがある.
最近はPythonに慣れてきたこともある.

方針

Pythonのウェブアプリ開発フレームワークについて理解してウェブアプリを開発する.
ただし,あくまで日曜大工的にやる.

Junji FujimotoJunji Fujimoto

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

Junji FujimotoJunji Fujimoto

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

となったのでちゃんと動いている模様.

Junji FujimotoJunji Fujimoto

Djangoのtutorialに移動して使い方を理解していく.

  1. 新たにDjangoプロジェクトを作成する(プロジェクト名visg
    $ django-admin startproject visg
    
    これでvisgというディレクトリが作成されて,始めるのに必要なファイルが作られた模様.visgは好きに決めていいらしいが,djangoとかtestにするとconflictが起こるらしい.こわい.
  2. とりあえず動くか確かめてみる.
    $ python manage.py runserver
    
    http://127.0.0.1:8000/にウェブブラウザでアクセスしてみると,ちゃんと動いているようだ.
    initial run
    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でキルする.

Junji FujimotoJunji Fujimoto

とりあえず動かし方と確認の方法はわかったので,ここからDjangoの使い方を本格的に学ぶ.

プロジェクトとアプリの関係

さっき作ったのはvisgというプロジェクトで,アプリはこれからプロジェクトの下に作っていくという考えらしい.
プロジェクトの中に複数のアプリがあってもよくて,一つのアプリは複数のプロジェクトに属していてもよいということらしい.

アプリの作り方

とりあえずチュートリアル通りにやってみよう.
pollsというアプリの作り方は

$ cd visg
$ python manage.py startapp polls

で出来る.pollsというディレクトリが作成されて,中に色々入っている.

とりあえずこの段階で,また$ python manage.py runserverしてみて,どうなるか確認してみるも,特に変化なし.
http://localhost:8000/polls/にアクセスしても404 Page not foundが表示される.
startappしただけでは何も動かないということらしい.

Junji FujimotoJunji Fujimoto

アプリの動かし方

チュートリアルにあるように,polls/view.pyというファイルに以下を書き加えてみる.

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というファイルを新規で作成して以下を書き込む.

polls/urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

まだhttp://localhost:8000/polls/にアクセスしてもダメ.

さらにさらにvisg/urls.pyを以下のように書き換える.

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),
]
  1. 元々はfrom django.urls import pathだったところに,includeを追加でimportする.
  2. 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になった.なんでだよ.

Junji FujimotoJunji Fujimoto

書き換えたところの意味を理解する

とりあえずチュートリアル通りに書き換えたら,チュートリアル通りの結果が得られた.

  1. プロジェクトをdjango-admin startproject visgで作ったときに,visg/visgというディレクトリができていた.
    これは,どうもvisgというプロジェクトの下にvisgというアプリが作成されたものと思ってよさそう.
    基本的にvisg/visgというアプリがvisgというプロジェクトでメインに動く感じか.
  2. python manage.py startapp pollsでアプリvisg/pollsを作成したとしても,アプリvisg/visgはまだ全然認識できていないらしい.
  3. まずvisg/visgvisg/pollsを認識させる方法としてvisg/visg/urls.pyというファイルに「visg/pollsというアプリがありますよ」ということを知らせる必要がある.
    それをpath()で指定するということか.includeのインポートは,付加的な修正だな.
    (でも基本的に,visg/visgから他のアプリを認識させるにはinclude()するものらしい.)
  4. それから,さらにvisg/pollsアプリの挙動を指定しなければならない.
    今回は挙動と言っても,polls/view.pyに「HTTPリクエストがあれば,文字列をレスポンスする」という簡単なものを書いただけ.
  5. 最後に,visg/polls/urls.pyでURLのさばき方を指定するのかな.
    urlpatterns = [path()]で指定するのは,visg/visg/urls.pyと同じなので,そうっぽい.

うーん,チュートリアルの書き方は変えた方がいいのでは.

path()関数の使い方

ここで一つ,path()の使い方をお勉強をする.path(route, view, kwargs, name)という風に使う.
正確な使い方は引用しておく方が賢明そうなので以下引用.

4つの引数を受け取ります。引数のうちrouteviewの2つは必須で、kwargsnameの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つのファイルを変更するだけで済むようになります。

Junji FujimotoJunji Fujimoto

チュートリアル通りだと,この次はデータベースの作成になる.
でも別にいま作りたいアプリはデータベース使わないと思うので飛ばす.

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だろう(適当)

Junji FujimotoJunji Fujimoto

気を取り直して,python manage.py createsuperuserする.
今度はうまく行ったようなので,UsernameEmail addressPasswordを適当に入力する.
それからpython manage.py runserverして,http://127.0.0.1:8000/admin/にアクセスしてみると,

先ほど入力したユーザ名とパスワードを入れてLog inを押してみると,

このままだとユーザとグループの管理しかできないようだ.
さっき作ったvisg/pollsはどうしたんだ,というお気持ち.

チュートリアルを読み進めてみると,「Poll アプリを admin 上で編集できるようにする」というのがあった.
だが,途中のデータベースの部分の機能を使うらしい.

もうちょっと読み進めてみたが,Django adminを使えばブラウザ上でデータベースを確認・編集できるようになるのか.とりあえずいらない.

Junji FujimotoJunji Fujimoto

どうも調べてみたら,データベースを使わないならDjangoじゃなくてもいいんじゃない?という文章があった.

そうかもしれない…!

ということで,Djangoは一旦やめます.

このスクラップは2022/07/23にクローズされました