ギャバンITサービス
お菓子の家が作れるシステムエンジニアです

djangoをdockerコンテナで利用(5) - djangoでデータベースの読み書き

ログインしないとページが見えないようなアプリケーションを構成し、データベースにある業務データを読み書きできるようにする。 1.dockerコンテナ準備onSSL 、 2.pip利用とhelloWorldとdb接続 、 3.グラフ表示練習 では環境を作り、処理を作っていくための習作みたいなものまで作れた。 その後 4.ログイン画面 もできた。 次はcrudを目指す。djangoでmariadbを読み書き削除させる。ListView,DetailView,CreateView,DeleteView,UpdateViewをそれぞれ使う。phpで作った全機能はまだ無理で部分的やけど、いくらか使えるようになったのでその作成メモ。 いろんなページ参照させてもらいました。 作者のみなさんありがとう。 【準備】crudするためのデータベース データの読み書き処理ではテストするときにデータをいくらか壊していく。 アプリケーションが無茶苦茶しても、データはいつでも元に戻せるようにしとかないとね。 自分の場合、オリジナルデータはgoogle cloudのlinuxで動かしているmariadbコンテナにあるから、そのコンテナの永続化領域をそのまま持ってきてローカルのmariadbのコンテナにアタッチして使ってる。 djangoの管理画面が起動できるようにしたときに作られるテーブルは10個。「auth_」で始まるものと「django_」で始まるものがそれ。 これを丸々mysqldumpってコマンドでバックアップ取っておき、データベース名を書き換えて「nariDB_Django」のスキーマへリストアし、「GVIS_」で始まる業務テーブルをcreateしておく。 nariDB_1stが業務テーブルだから、nariDB_Djangoに向かってa5sqlの「スキーマ間のデータ転送」を使ってデータを流し込めばいつでもデータがオリジナルと同じになる。 a5sql の作者さんありがとう。 このソフトウェアとても優秀。使ってないけど、なぜかテーブル定義書まで出せる。しかもけっこうキレイに出る。ポータブル版としても動くのでめっちゃ便利。 以前はoracleやsqlserverも扱うことがあったからnavicatを使ってたけど、今はmariadbだけなのでa5sqlで足りる。 navicat は有償で高価だけど、データの移行はめっちゃ楽。それはまた別の機会に。 オリジナルデータにはblobが入っているテーブルがあって、その中にjpegやpdfが入っている。だからコミットは1000件ずつじゃなく、100件ずつでのっそり動かす。トータル4GB程度なので、5分ぐらいで転送終わる。 サラッと書いてるけどコンテナで扱うからちょっと工夫が必要。 DBはまた別のページで書くか。 【準備】自前のcss 自前というか、以前に人にお願いして作ってもらったものを更新しながら利用。タブレットとかiphoneで見るためのおまじないのためでもある。 php版ではやってないけど、djangoではページネーションに挑戦。検索結果を表示するとき、たとえば1ページ20個レコード表示させておき、その他レコードは別ページでってことで。 ページネーションってこういう感じのやつ。 これをやるにはcss使う。ググるとbootstrapを使うのが多い。自分は普通のページネーション装飾を参考にさせてもらい、ベース色を変更してcssに追記した。 実際はまだまだ作りこんでいくので、ページネーションする箇所は別htmlで切り出して使うようにした。 【結論】実際の動き 見た目の動きはこうなる。以下作った順。 ログイン 前回作った画面でログインする。イントラのサイトでオレオレ証明書使ってsslでつながってくれる。 メニュー画面 未作成箇所あるけど、今回は真ん中のボタン「(作成中)資産一覧」ってとこ。他にも帳簿入力画面とか作っていくんだけど、crudの基本を資産登録機能で作っておいた。 一覧表示 ページネーションで最終ページ表示させたところ。 この表示ができるようになるのは苦しんだ。djangoにはページ表示のために関数版とクラス版があることに気づき、関数版で作りかけてたのをクラス版でやり直した。modelsとformsを組み合わせて自動生成してくれるのもなかなか理解しづらかった。 php版で実現していることはそのまま実現できないので、まだまだデザイン変えてかないと。 最後の3件はテストで作成したレコード。 詳細表示 今はのっぺりしてるけど、この機能を最後まで作ったらmariadbのテーブルのblob列に入ってる写真やマニュアルを閲覧するのに使うかな。 新規作成 テストデータ入れて試してるところ。作ってる途中はフォームの扱いに苦しんだな。 削除 確認メッセージは必要やね。このあたりで新規作成と更新画面の両方に確認メッセージと、完了メッセージの表示させ方考え始めた。 更新 本当はこの画面の「Seq2」は入力項目じゃなくて自動発番させたい。レコードの中から最大値を得てインクリメントしたものを設定すればたぶんできるけど、今はこのままでいいか。 更新だけじゃなく、新規作成もだけどjavascript使って確認メッセージ出るようにした。バリデーションとか入力画面を作ってくれるなら、このへんもdjangoでやってくれたらいいのに・・・。 djangoの修正対象はけっこうある 今回もある程度できた後で、gitの差分を見ながら作った箇所書いてるのな。 ...

 ⭐️

djangoをdockerコンテナで利用(4) - ログイン画面作成

ログインしないとページが見えないようなアプリケーションを構成する。 その(1) 、 その(2) 、 その(3) では環境を作り、処理を作っていくための習作みたいなもの。 元々はphpで作って使っていたものを、djangoで作り直すのが目的。 phpで5年前に事務処理用で作ったものを、 djangoでこれから作り直す(円グラフはサンプルしかできてないけど・・・)。 やっとログイン画面と、その中のアプリの1つ目が使えるようになったのでその作成メモ。 ログインして見えるアプリケーションができるまで 「あーでもない、こーでもない」ってしばらく悩みながらdjangoいじった後、結局完成した後でgitの差分を見て書いてるのな。 アプリケーションとして「gvisWebApp」を追加して自動生成された内容に、⭐️印の箇所を編集してった。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 /code/app |--gvisDjango3 | (省略) |--gvisWebApp | |--__init__.py | |--__pycache__ | |--admin.py | |--apps.py | |--migrations | |--models.py | |--tests.py | |--urls.py ⭐️ | |--views.py ⭐️ | |--templates/gvisWebApp ⭐️手動作成 | | |--base.html ⭐️手動作成 | | |--login.html ⭐️手動作成 | | |--logout.html ⭐️手動作成 | | |--home.html ⭐️手動作成 | | |--gvis_001_IntraIchiran.html ⭐️手動作成 |--manage.py |--requirements.txt |--templates | |--gvisDjango3 | | |--gvisDjango3Top.html |--website | |--__init__.py | |--__pycache__ | |--asgi.py | |--settings.py ⭐️ | |--static | | |--admin | |--urls.py ⭐️ | |--wsgi.py ログインはdjangoに基本機能があるらしい phpのときはログイン画面を実装している人がたくさんおられたので、参考にして作った。 ...

 ⭐️

djangoをdockerコンテナで利用(3) - django3でグラフ作成

自前DBには計算して表示させる内容とか、blob列にpdfやjpegを入れてる。 そういうのをdjangoから扱うための基礎動作確認ページを作っておこうと思った。 php7.4のコンテナにimagick追加して苦労して表示させてるのを、djangoだと一発で表示できる。円グラフのpng画像が表示できることを目指す。 ubuntu20でdockerコンテナ動かして、django取り扱いやってみるか。 グラフ表示できるようになるまで グラフを表示させるために、処理を追加するんだけど、表示ができるようになるまでの解説ページがなかなか理解しづらかった。 円グラフ表示できるようになってからは、日本語フォントの扱いがなかなかうまく行かず、2日ぐらいは悩んだ。 それでも、円グラフが縦長表示になる問題が残って、htmlのimg srcの表示をいじった。 次に円グラフに注釈が入ってほしくて、ググって見つけたソースを下敷きにしてやってみた。 何もない状態から、最終的にはこんなグラフが表示できた。 djangoでいじった順番 websiteのプロジェクトを作っておいて、gvisDjango3アプリケーションを既に追加してあり、html表示させるためのテンプレートも作ってある。 linuxに djangoのdockerコンテナ作る とこと、 hello worldから始まってDB読むところ は別のところにメモった。 以下、いじった順番。vscodeのGitGraph見たらこんな感じやった。 ライブラリをrequirements.txtに追記してグラフ描けるようにする テンプレートにグラフの画像を描かせる場所を追記する 画像表示させるリクエストに応答するための追記をする グラフを描かせる 微調整 いじった箇所は⭐️の4箇所。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /code/app |--gvisDjango3 | |--__init__.py | |--__pycache__ | |--admin.py | |--apps.py | |--migrations | |--models.py | |--tests.py | |--urls.py ⭐️3 | |--views.py ⭐️4,5 |--manage.py |--requirements.txt ⭐️1 |--templates | |--gvisDjango3 | | |--gvisDjango3Top.html ⭐️2 |--website | |--__init__.py | |--__pycache__ | |--asgi.py | |--settings.py | |--static | | |--admin | |--urls.py | |--wsgi.py グラフ表示やってみる ライブラリをrequirements.txtに追記してグラフ描けるようにする なんていうライブラリがあるんだろー、からググってmatplotlibでいろいろできそうってことがわかった。 ...

 ⭐️

djangoをdockerコンテナで利用(2) - pipでdjangoのパッケージを更新する

インフラ作業してSSL接続によるロケット画面が表示できるようになったので続きを勉強して試しながら実施。 dockerコンテナ内のコマンドライン python3とpip3を使っていく。 コンテナのbashに入る。 1 2 3 4 5 $ docker ps | grep django 8b95c47cd3b0 sv_django:3.1.5 "supervisord -n" 12 days ago Up 40 minutes 0.0.0.0:38080->8080/tcp, :::38080->8080/tcp docker_sv_django_1 f7530c88c5ab mysql:5.7 "docker-entrypoint.s…" 2 weeks ago Up 39 minutes 33060/tcp, 0.0.0.0:23306->3306/tcp, :::23306->3306/tcp docker_sv_django-DBServer_1 $ docker exec -it docker_sv_django_1 bash root@svdjango:/# コンテナの中ではviすら使えないこともあるので、必要ならaptとかyumとかでインストールしておく。 requirement.txtに書いて管理 パッケージを一括で管理する。 他に依存するものは勝手に取ってきてくれるらしい。 upgradeした後で、バージョンNo書き換えれば最新を維持できる。 phpは5から7に上げるとき苦しんがけど、djangoは楽にバージョン上げていける運用になったらいいなぁ。 ...

djangoをdockerコンテナで利用(1) - SSL利用

きっかけ そもそも、phpで自前のwebアプリを作って帳簿を管理している。 後学のためでもあるし、確定申告のためでもある。 webアプリはlarabelとかじゃなくて、ベタのphp。 動かし始めて7年、毎月帳簿をつけ年末になるとせっせと申告準備してる。 phpは賞味期限が長くないので、バージョンを上げていく頻度はけっこう短い。 jpeg/pdf保管にimagickを使っているので、この扱いがけっこう面倒。 グラフ表示もやってるし。 そこで、機能移行が全部できるか調べながらだけど、phpからdjangoに引っ越すことに。 既存DBの帳簿データや、グラフ表示を1円も誤差なく表示させられるのか? イントラでssl接続も実現させた。 そこでやってみた。 https化したdjango環境を作る あっちこっちで書かれているdjangoのロケット表示画面とadmin画面を自分でもdockerコンテナ使って作成してみた。 ロケット表示画面はSSLで提供できないかって考えてたら、やっておられる方がおられたので参考にさせてもらった。 (自分にとってはとてもいいヒントと問題提起になった) ただし、admin画面はcsrf検証エラーになってしまうので、そこだけはdjangoのコンテナ直つなぎ。 もう少し勉強して解決できたらいいな。 ※別の日にこの文章作るためにコンテナ作り直したら、admin画面のcsrf検証エラーがなくなった。その代わりdjangoコンテナに直接つなぐとcsrf検証エラーが発生するようになった。目的は達成できたけど、エラーになる原因は??? まだわからん。 【参考URL】 [Docker]Djangoを無料でHTTPS化して簡単にデプロイする方法 | エンジニアの眠れない夜 sleepless-se.net GitHub - SteveLTN/https-portal: A fully automated HTTPS server powered by Nginx, Let's Encrypt and … github.com uWSGI入門 | Python学習講座 www.python.ambitious-engineer.com Django + uWSGI + nginx (uWSGIチュートリアルの和訳) #Python3 - Qiita qiita.com Djangoサイトのセキュリティ見直しメモ - ikura1's log ikura-lab.hatenablog.com dockerでビルドしてコンテナ動かすときは、自分の環境にフィットさせるために考えてdocker-compose.ymlとDockerfileを書き換える必要がある。 これがけっこう考えさせられるし、いい勉強になる。 あれこれ試しているときに、記事の内容で「docker-compose down」なんてそのまま動かすと、 自分の消したくないコンテナまで消えて「あー、手がスベった」ってなることもあった。 たまたまoracleのコンテナ動かしてたときは、docker-composeでdownを指定しちゃうと「あーsql動かしなおしかー」みたいなことになって時間がないときツラい。 以下、自分のdocker-compose.ymlの記述の一部。 djangoはデータベース利用に制限があるらしく、単一カラムに主キーがついたテーブルでないと扱えないらしい。 既存mariadbが自分のデータベースとして別で存在するけど、ちゃんと扱えるようになるまで別コンテナのmysqlを1つ用意しておく。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 sv_https-portal: image: steveltn/https-portal:1 ports: - '30080:80' - '30443:443' environment: DOMAINS: 'nafslinux.intra.gavann-it.com -> http://svdjango:8080' STAGE: 'local' # or 'production' volumes: - ./nariDockerDat/sv_django-ssl_certs:/var/lib/https-portal sv_django: image: sv_django:3.1.5 build: ./nariDockerDat/sv_django-uwsgi-nginx hostname: svdjango volumes: - ./nariDockerDat/sv_django-uwsgi-nginx/app:/code/app ports: - '38080:8080' sv_django-DBServer: image: mysql:5.7 hostname: 'svdjangoDBServer' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - "23306:3306" environment: MYSQL_ROOT_PASSWORD: hogehoge MYSQL_DATABASE: djangodb MYSQL_USER: gvis MYSQL_PASSWORD: mogemoge TZ: 'Asia/Tokyo' volumes: - ./nariDockerDat/sv_django-db/lib:/var/lib/mysql - ./nariDockerDat/sv_django-db/etc:/etc/mysql - ./nariDockerDat/sv_django-dbconf:/docker-entrypoint-initdb.d :(中略) フォルダの準備 /dockerをベースディレクトリにしている。 sambaで丸ごと共有し、windows/mac/linuxのvscodeから編集できるようにしてある。 ...