DjangoとAjaxでハードディスクの容量を表示

少しずつ時間をとって最近作ってたのがこれ。Pythonでpipeを使って実行したdfコマンドの結果を整形し、Djangoでviewを作ってAjaxで表示したもの。Ajaxのライブラリには、SimpleJSを使ってみた。

ファイルの命名は適当ですがお気になさらず。サイズを取得してるディレクトリとかは、それぞれの環境に読み替えよろしく。Djangoについて多くは書かないので参考程度に。Windowsでは当然動きませんがあしからず。

  • projectdir/modules/status.py
import os
import re
def diskinfo(dir):
    pipe = os.popen('df -h | grep \" %s$\"' % dir, 'r')
    text = pipe.read()
    pipe.close()
    info = re.split('[\s]+',text)
    if text != '':
        return {'volume':info[0], 'total':info[1], 'used':info[2], 'free':info[3], 'useper':info[4]}
    else:
        return None
  • projectdir/diskinfo/views.py
from projectdir.modules import status
from django.http import HttpResponse

def diskinfo_ajax(request, dir, prop):
    if dir == '_extra1':
        d = '/var/ftp/_extra1'
    elif dir == 'global':
        d = '/'
    else:
        d = '/'
    st = status.diskinfo(d)
    return HttpResponse(st[prop])
  • projectdir/diskinfo/urls.py
from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns('',
    (r'^ajax/(?P<dir>\w+)/(?P<prop>\w+)/$', 'projectdir.diskinfo.views.diskinfo_ajax'),
)
  • projectdir/static/js/diskinfoajax.js
function LoadDiskInfo() {
  $ajaxreplace("diskused_global", "/diskinfo/ajax/global/used/", false);
  $ajaxreplace("disktotal_global", "/diskinfo/ajax/global/total/", false);
  $ajaxreplace("diskused_extra1", "/diskinfo/ajax/_extra1/used/", false);
  $ajaxreplace("disktotal_extra1", "/diskinfo/ajax/_extra1/total/", false);
}
  • /projectdir/templates/index.htm
{中略}

<script language="JavaScript" type="text/javascript" src="/static/js/simple.js"></script>
<script language="JavaScript" type="text/javascript" src="/static/js/simpleajax.js"></script>
<script language="JavaScript" type="text/javascript" src="/static/js/diskinfoajax.js"></script>

{中略}

<body onload="LoadDiskInfo();setInterval(LoadDiskInfo, 30000);">

<table class="diskinfo_table">
  <tr>
    <td>/</td><td class="disksize"><span id="diskused_global">----</span>/<span id="disktotal_global">----</span></td>
  </tr>
  <tr>
    <td>/_extra1/</td><td class="disksize"><span id="diskused_extra1">----</span>/<span id="disktotal_extra1">----</span></td>
  </tr>
</table>

{中略}

30秒間隔で自動更新。