見出し画像

続編:バックグラウンドで動く処理と投稿者別でソート

前回、pythonでウェブアプリ作ってみましたという投稿を申し上げましたがその続編です。あくまで実験的に作っているもので、かつ自分が少しでも使えるものをということでやっています。ド素人ですので、全然スマートさはありませんが、楽しんでできています。前回の分はこちら:

ツイッターのAPIからタイムラインを取得してきて、本文と投稿者名と時間を取得してデータベースに書き込んで、投稿時間の新しいものから30件が表示されるというただそれだけのものです。Djangoというフレームワークを使って、Herokuにデプロイしました。

ただ、ページを開くたびに10秒くらいかかるなぁ。と思っていたんです。よくよくどういう実行のされ方をしているかと考えたら、ページを読み込んだときに毎回ツイートの読み込み、データベースへの書き込み、データベースからの取得とソートをやっているので時間がかかるんではないかと思ったんです。しかも、ページをビューした瞬間にしかタイムラインんを取得できないということは、誰も見ていない時間のタイムラインは一切取得できていない。これはイマイチだなぁという気がしてきました。

なのでごく自然に「ツイートの取得とデータベースへの書き込みは自動でやってほしいなぁ」と思うようになりました。データベースには一定間隔で自動で蓄積していって、ページを表示したときにはそこから取得とソートだけするようにできないかなぁと。

でいろいろ試行錯誤したのですが、何をやってもエラーが出て全然すすめなかったんですよね。どうやらAPSchedulerというものを使うとこういう処理が一定時間間隔でできるらしいと。Apschedulerを使ってclock.pyというファイルをプロジェクト直下に作り、そのファイル内でツイートを取得する関数をインポートすることにしたんです。でも、それをやると必ず原因不明のエラーが出るんです。”Improperly configured”といって、Environment variableを設定しろとかなんだとか。でもいろいろ調べるとPython manage.py shellからそのclock.pyを実行するとうまくいったんです。僕もDjangoの仕組みをよく理解しきれていないので、なんとも言えませんが、Djangoの外からclock.pyを実行してDjango内 のアプリを呼び出そうとしたのが良くなかったんじゃないか、くらいに考えています。

で次に、Herokuにデプロイした後に、clock.pyをmanage.py shellから実行するというわけにもいかないよなぁと思い。実際にHerokuのコンソールでpython manage.py shellと立ち上げて、import clock  sched.start()とかやると確かに自動で読み込みが始まるのですが、そのコンソールを開けている間しか立ち上がらないので、違うなぁと。で、いろいろまた調べていると、python manage.py <コマンド> を自作できるらしいということがわかって、ということは、Procfileに clock: python manage.py <コマンド>とやれば自動で起動し続けてくれるんじゃないかと思ってやってみたら、できました。あー難しかったし、すべてを解決したわけじゃないのですっきりしないけど一応思う形ができてすっきりです。しかも、ページを表示するタイミングでツイートを新たに読み込まなくなったので、表示にかかる時間が超速くなったのはよかったです。

もう一つ追加したのは、Sourceのところ。ツイートの投稿者の名前をクリックすると、その投稿者の投稿だけ直近30件をソートして見れるようにしたくらい。templateとurls.pyとviews.pyをすこしずついじったらできた。こういうことが考えた通りに動くととてもうれしい気持ちになります。

見た目は何も変わっていないですが、上記ポイントを更新して以下のような感じになりました。

画像1


この記事が気に入ったらサポートをしてみませんか?