Python初級者がDjangoと闘う話
闘ってるなう。
Pythonには仮想環境というものがあるらしい。
いきなりDjangoじゃないところでずっこけた。
もうemacsなんて卒業しなよって言われたのでvscodeで開発してみることにしたんですけど、vscode django get startedでググったら出てきたサイトにそう書いてあったからやってみることにした。
Pythonの仮想環境って何がいいの?
仮想環境ごとにモジュールを入れることができる。
作り方
python -m venv [仮想環境名]
って打つと、[仮想環境名]のディレクトリができる。
なるほどここにjarファイル…じゃなくてモジュールのファイルが入るわけね。
仮想環境への入り方
入りたい仮想環境=ディレクトリ配下のスクリプトを実行。
windows環境、.ps1つけないとなんかうまく動かなかったのでつけています。
.\[仮想環境名]\script\activate.ps1
これでvscodeのターミナル上はいつものディレクトリの前に([仮想環境名])ってついたターミナルに変わる。
仮想環境から抜ける
抜けるときはディアクティベート。インストールしたものは失われない。
exitするとターミナル自体が閉じた。ガッテム
deactivate
仮想環境を消す
消すときは単にディレクトリをそのまま消せばよい。
Djangoのインストール
pip install --upgrade pip
pip install django
バージョンを指定したい場合は適宜読み替えてください。開発環境なんでとりあえず最新版でいいや。
Djangoのプロジェクトとアプリを作る
プロジェクトとアプリってなんだ???????
チュートリアル読むと「プロジェクトを作ります」とか「アプリを作ります」とかアッサリ出てくるけどオメーナニモンだ???????
結論:いろいろ設定ファイルが入ったディレクトリ
python manage.py startproject [プロジェクト名]
python manage.py startapp [アプリ名]
startprojectやstartappをすると、djangoのプロジェクトやアプリという概念に必要なファイルが配置されたディレクトリができる。
ただし、概念としてプロジェクト>アプリなので、プロジェクトの中にアプリを作ることができるけど、アプリの中にプロジェクトを作ることはできない。
さらに、1つのプロジェクトの中に複数のアプリを作ることができる。
分け方については哲学だと思うからまあ好きにわけてくれ。「django プロジェクト アプリ 分け方」でググったけどまじでためになる記事出てこなかった。
ググって出てくるものって単一機能のものが多いから仕方ないね…
私は次のようにしました。
root
|-- main (project)
|-- web (app)
|-- backend (app)
|-- link (project)
メイン部分と、他システムと連携する部分を別のプロジェクトにし、
メインをwebサイトを構築するアプリとバックエンドを動かすアプリに分けました。
まあこの辺は宗教ですから!プロジェクトとアプリの中に入ってる設定ファイルが活用できそうなレベルで分けるといいかなと思います。
動的に内容が変わるフォームが作りたい。
なんか試してるときは全然情報出てこなかったのに、今ググったらわりとあっさり出てきた。こまめにキャッシュ消してたはずなんだけど。IPとかで見てんのかな。
多分このサイトで大丈夫だと思う。
私はviews.py内でget_form_kwargsという、forms.pyに値を渡せる組み込み関数をオーバーライドして実装してみました。あとで書きます。
・フォームで聞きたい内容が、とあるデータベース(テーブル)のRowに入っている。
・なぜそうしたいか?フォームの選択肢を増やすためにテーブルのColumnを触りたくないからである。
・ではforms.py内でテーブルに問い合わせすればよいのでは?しかし、動作を見た限り、forms.pyはサーバ側で再読み込みしないと実行されない。views.pyはページの更新時に実行される。選択肢は、ユーザがページの更新をした時点で反映してほしいのだ。
わがままなのだ。
多分考え方がdjangoに即していなくて、djangoの考え方としてはデータベースは考えなくていいよ、全部モデルでやろうよ、こちらでよしなに処理するからさ、ということなのだと思う。
拡張手段があるあたりが流行る理由なんだと思うけど、初心者がやることではないぽいね。
残念ながら私はインフラエンジニア寄りなので、足元からガチガチに固めたいのです。
…javaとかPHPで書いたほうが早ぇ。
30分でできる実装を3日かけてるの、ほんとバカバカしい。。。
まあ勉強もかねてなので、頑張ってみよう。
ユーザ管理
まずadminサイトを作らないといけないらしい。
adminサイトを作るにはスーパーユーザを作らないといけないらしい。
ふむ。
まあよくわからんが、ここはチュートリアル通りにやる。
どうせadminサイトなど後で消すのだ。
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
makemigrationで ./configure 、magirateで make/make install な印象をもった。いつかわからんけどmigrationってディレクトリができていた。
Permission Deny
正確なメッセージは忘れたけど、コマンドを実行(?????)したらpermission deny的なことを言われた。migrateはデフォルトでsettings.pyのDATABASESのdefaultに設定されたユーザを使うようだ。そう書いといてくれな。
一時的にdefaultにす~ぱ~なDBのユーザを割り当てて実行したけど、settings.pyのDATABASES内に記載があれば「--database=[settings内のデータベース名]」で使うユーザを指定できるぽい。
INSERT command denied to user 'guest'@'localhost' for table `[database name]`.`django_session`
adminサイトもできたということで、settings.py内のdefaultのユーザ権限をguestというselectしかできないクソザコ権限に戻したところで、
早速管理サイトにログインしてみると、例外を吐いた。
いま躓いていること
言いたいことはわかった。じゃあguest以外の権限で実行させてくれな!
そして実行するDBユーザにはどの権限を割り当てればいいか教えてくれ!
https://docs.djangoproject.com/en/4.1/topics/db/multi-db/#selecting-a-database-for-save
これだ。
いや方法あるならもっと堂々と書いてくれな。(ドキュメント読め)
using='[setting's_database_name]'でやったらpermission denyじゃなくてaccess denyが出ました。なんで?????
原因を探ろうと思ってmaria dbのログはどこかなーってググったらwindowsの情報全然出てこなくて草。結局サービスから見たよ。。。
続く!