diadia

興味があることをやってみる

djangoにクローン機能を実装する

djangoウェブアプリケーションで表示される情報を定期的に更新したい

現状のプロダクトでは、postgresqlcsvのデータをコピーしただけなのでデータは変更されない。ブログのようなアプリケーションならこれで十分だけれども、定期的に情報を更新したいものには対応できない。例えば、株価、為替、天気のような情報だ。これが問題だった。情報を更新するには何が必要か調べたのでメモしておく。

情報更新に必要な要素

情報収集する際に"django クローン"で調べるといろいろ情報が出てきた。それをもとに必要な要素が確定した。

  • データオブジェクトの更新
  • 更新トリガーを作る
  • 更新する頻度の設定

データオブジェクトの更新

データオブジェクトの更新は、views.pyの中でデータオブジェクトを抽出し、当該オブジェクトのデータを変更して、save()すれば良い。変更内容はスクレイピングなどを利用して更新したい情報を取得する。

更新トリガーを作る

更新トリガーはdjango-admin コマンドの実装を参考にした。 https://docs.djangoproject.com/ja/2.1/howto/custom-management-commands/

python manage.py hogehoge

という自作のコマンドを作成することができ、これによりコマンド入力の際にviews.pyを走らせることができるようになる。

更新する頻度の設定

これはサーバのクローンを利用する。crontabコマンドを使うと定期的に指定した日時で何らかの指示を実行してくれる。

具体的な実装手続き

django-extensionsの採用

djanogo-extensionsを利用するとcommand作成に必要なディレクトリやファイルの構造を自動で作成してくれる。だからviews.pyでどんな挙動にするかを記述することに専念することができる。

django-extensionsのインストール

こちらを参考にさせていただきました。
https://tokibito.hatenablog.com/entry/20150827/1440602095

$ pip install django-extensions

settings.pyを編集する。注意点はpipインストールしたモジュール名はdjango-extensionsだけれども、追加する内容はdjango_extensionsで異なる。ハイフンとアンダーバーの違いに注意すること。間違うとコマンド作成時に以下のエラーになります。

ModuleNotFoundError: No module named 'django-extensions'

話は戻ってsettings.pyの編集。

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_extensions',  # この行を追加
)