kuroの覚え書き

96の個人的覚え書き

ユーザー認証はややこしい

丸一日かかってもまだうまく動かない。こまったな。

その過程でちょっと悩んでいたことが理解できたようなきがするので整理。

  • manage.py  起動に関わるスクリプト
  • app/view.py アプリのコアとなるスクリプト
  • app/__init__.py モジュールなど、アプリ全体で使う機能を集約しているスクリプト
  • app/models.py データベースの構成を定義
  • app/config.py 設定ファイル

という感じの役割があって、manage.py、view.pyがその他で集めた機能をimportして使っているという感じで理解していた。
多くのモジュールを__init__.pyがインポートし、manage.pyがそれをまとめてインポートしているのはいいのだが、初期の学習段階でこれらファイルを分割する際、どういうわけか__init__.pyで

from flask_script import Manager
manager = Manager(app)

とManagerをインポートし、manage.pyで

from app import manager

とmanagerをインポートすれば良さそうなものなんだけど、何故かこれではうまく行かず、view.pyに

from app import manager

としたうえでmanage.pyで

from app.view import manager

としてやったら思うように機能した。これが一見不思議で、view.pyでは特にmanagerの機能が必要そうには見えないわけで、あれやこれやカット&ペーストで移動してみたりもしたが、どうも最初の構成でしかきちんと表示されない。

結構悩んだんだが、ようやくつかめてきた。実際managerはview.pyで使われていないので、インポートする必要はない。ただし、view.pyをmanage.pyからインポートしていないといけない。そうでないとmanage.pyとview.pyの関係が作れないから。
プログラムを分割する過程で、最後に触ったのがmanager関連だったのでそこで首の皮つながっていたという感じなんだろう。

結局、これが一番スマートかな、という構成は、

  • __init__.pyは当初のようにflask_scriptからManagerをインポートしappに組み込む
  • view.pyにはmanagerはインポートせず
  • manage.pyにappからmanagerをインポートし、かつimport app.viewでまるごとインポート。

また、__init__.pyの使い方が何通りかあるようで、アプリの規模によっては使い分けが必要かもしれない。書き方そのものも何通りかあって、ネットの情報でも人によって書き方が違っているので、そこをきちんと相互変換できるようにしておかないと、統一感のあるきれいなコードが書けなくて、あとで困ることになるだろう。