前回、djangoフレームワークの基本的な使い方を紹介しました。簡単にデータベースと紐づいたWebアプリを作ることができました。今回はもう少し踏み込んで、Swampdrgonというモジュールを使い、リアルタイムでWebページのデータを更新する方法を紹介します。
django+swampdragonというイメージで、ほぼdjangoと同じにようにWebアプリを作成していきますので、djangoに慣れている人は分かりやすいと思います。
swampdragonのインストール
まず、pipを使用してswampdragonをインストールします。
sudo pip3 install swampdragon
swampdragonをインストールすると、古いバージョン(1.8)のdjangoのがインストールされてしまいますので、下記のコマンドで最新版のdjangoを入れなおします。
sudo pip3 install django==1.10.4
Redis-serverのインストール
swampdragonで使用する、redis-serverというアプリをインストールします。
sudo apt-get install redis-server
SwampDragonプロジェクトの作成
Raspberry Piのターミナルで下記のコマンドを実行します。(djangoとかなり似ています。)
dragon-admin startproject プロジェクト名(djtest)
(django-adminではなく、dragon-adminなので注意してください。)
djtestフォルダが生成されますので、cdコマンドで移動します。
cd djtest
次にアプリケーションフォルダを下記のコマンドで作成します。
django-admin.py startapp アプリケーション名(webpi)
(ここはdjango-admin.pyです。今回もアプリケーション名はwebpiとしました。)
このふたつのコマンドでswampdragonプロジェクト/アプリケーションに必要なベースフォルダ/ファイルが自動生成されます。
setting.pyの設定(djtest→djtest→setting.pyのファイルの編集)
djtest→djtest→setting.pyのファイルを下記のように編集します。djangoの時によりも少し編集する項目が増えています。
ALLOWED_HOSTS = ['xxx.xxx.xxx.xxx']
※xxx.xxx.xxx.xxxのIPアドレスはRaspberryPiのIPアドレスになりますので注意してください。
INSTALLED_APPSの中に今から作成するアプリ名を追加します('webpi' 、'swampdragon',を追加)。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'swampdragon',
'webpi',
]
DATABASESの中の'swampdragon'の記載を削除します。
※これはたぶんswampdragonのバグだと思います。私の環境だけかもしれません。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'swampdragon', ←削除する
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
ファイルの一番最後に下記も追加します。
※DRAGON_URLのxxx.xxx.xxx.xxxはRaspberry PiのIPアドレスになります。
DRAGON_URL = 'http://xxx.xxx.xxx.xxx:9999/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
データベースの構築
django(以前のブログ参照)と同様に、下記コマンドでデータベースを作成します。
python3 manage.py migrate
スーパーユーザーの設定
これもdjangoと同様です。
python3 manage.py createsuperuser
・ユーザー名: admin
・メールアドレス: pi@pi.com ※任意
・パスワード: raspberrypi ※任意 あまり短いとエラーになります。
・パスワード(再入力): raspberrypi ※任意
swampdragonフォルダの更新
swampdragonはDjango Ver1.8で動作するように作られており、Django Ver1.10を使うとエラーが出てしまいます。下記サイトのswampdragonファイルはDjango Ver1.10に対応していますので、ファイルを差し替えます。
https://github.com/jonashagstedt/swampdragon
まず、上記サイトを開き、swampdragonフォルダを丸ごとダウンロードしてください。
ダウンロードしたswampdragonフォルダ内のswampdragon_server.pyを開き、下記のxxx.xxx.xxx.xxxの部分をRaspberry PiのIPアドレスに変更します。
HOST = getattr(settings, 'SWAMP_DRAGON_HOST', 'xxx.xxx.xxx.xxx')
下記サイトを参考にダウンロードしたswampdragonフォルダ→serializers→model_serializer.pyの’def _get_m2m_fields(self):'関数を書き換えてください。
https://github.com/jonashagstedt/swampdragon/pull/164/files
def _get_m2m_fields(self):
if hasattr(self.opts.model._meta,'get_all_related_many_to_many_objects'):
related_m2m = [f.get_accessor_name() for f in self.opts.model._meta.get_all_related_many_to_many_objects()]
else:
related_m2m = [f.get_accessor_name() for f in [_f for _f in self.opts.model._meta.get_fields(include_hidden=True) if _f.many_to_many and _f.auto_created]]
m2m_fields = [f.name for f in self.opts.model._meta.local_many_to_many]
m2m = m2m_fields + related_m2m
return [f for f in self.opts.update_fields if f in m2m]
その後、ダウンロードしたswampdragonフォルダと下記のswampdragonフォルダを入れ替えてください。
/usr/local/lib//python3.4/dist-packages/swampdragon
また、ダウンロードしたswampdragonフォルダ→static→swampdragon→js→dist→swampdragon.min.jsファイルをdjtest→staticフォルダ(新規作成)にコピーしてください。
BootStrapのダウロード
見た目をきれいにするために、下記のURLからbootstrapをダウンロードし、解凍します。
解凍ファイル(css、fonts、jsフォルダ)をdjtest→static(新規作成)に保存します。
jQueryのダウロード
下記のサイトからjQueryをダウロードし、djtest→static→jsフォルダに保存してください。
動作確認
いっきに環境準備、設定を行いましたが、ここでdjango部分が動作しているか確認します。これもDjangoの時と同じです。下記コマンドでWebサーバーを起動します。
python3 manage.py runserver xxx.xxx.xxx.xxx:8000
※xxx.xxx.xxx.xxxのIPアドレスはRaspberryPiのIPアドレスです。
RaspberryPiと接続可能な同一ネットワークにいるWindowsPC等で、ブラウザを開き、アドレスバーに http://xxx.xxx.xxx.xxx:8000 と入力して、Enterキーを押します。ポート番号を入れるのを忘れずに。
It Workedと記載されたテストページが表示されれば、プロジェクトのセットアップは完了です。
次回は、コードを書いてWebアプリを作成していきます。これもdjangoと似ています。