Symfoware

Symfowareについての考察blog

Pythonフレームワーク「Tornado」を使用し、JSON形式のデータを公開する

Python製のWebフレームワーク「Tornado」を使用して、
データベースのデータをJSON形式で公開してみます。

Tornado

環境は以前インストールしたものを使用しました。
Windows XP + Python 2.6系です。
Windows XPでPythonフレームワーク「Tornado」を動かす




SQLiteデータベースの準備



サンプルなので、SQLiteのデータベースを使用することにします。

Lita - SQLite Administration Tool
http://www.dehats.com/drupal/?q=node/58

AIR製の便利なツールがありますので、インストールして事前にこんなデータを投入しておきました。

07_001_20100917172303.png


このデータを読み込み、JSON形式のデータとしてクライアントに返すことにします。




Tornadoのソース



トップページにアクセスしたら、問答無用で作成したmasterデータベースを検索し、
JSON形式に変換して返すようにします。



# -*- coding: utf-8 -*-

import os
import sqlite3
import json
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.autoreload


from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)
class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r"/", JSONHandler),
        ]
        settings = dict(
            template_path=os.path.join(os.path.dirname(__file__), "templates"),
            static_path=os.path.join(os.path.dirname(__file__), "static"),
        )
        tornado.web.Application.__init__(self, handlers, **settings)

        # Have one global connection to the blog DB across all handlers
        self.db = sqlite3.connect(r"C:\sample\test.db")


class JSONHandler(tornado.web.RequestHandler):
    @property
    def db(self):
        return self.application.db
    
    def get(self):
        
        data = []
        for row in self.db.execute("select id,name from master"):
            data.append({'id':row[0], 'name':row[1]})
        
        
        self.write(json.JSONEncoder().encode(data))



def main():
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()



これをサーバー側で起動しておきます。

ちなみに、jsonの使い方はこちらのドキュメントを参考にしました。
18.2 json - JSON encoder and decoder






Excelマクロのソース



JSONデータを読み込み、セルに表示するマクロです。
ほとんど、ExcelのVBAでJSON形式のデータを解析するの内容と同一です。


■ボタンクリック部分

Private Sub CommandButton1_Click()
    
    Dim row_count As Long
    Dim obj As JSON
    Set obj = GetJSON("")
    
    row_count = 6
    Do While obj.HasNext
        Sheet1.Cells(row_count, 1) = obj.getValue("id")
        Sheet1.Cells(row_count, 2) = obj.getValue("name")
        row_count = row_count + 1
    Loop
    
End Sub
Sub Clear_Click()
    
    Dim row_count As Long
    row_count = 6
    
    
    Do While True
        If Sheet1.Cells(row_count, 1) = "" Then
            Exit Do
        End If
    
        Sheet1.Cells(row_count, 1) = ""
        Sheet1.Cells(row_count, 2) = ""
        row_count = row_count + 1
        
    Loop
End Sub




■ConnectionModule(データ取得部分)

'接続するURLのベース部分を指定
Private Const TARGET_URL As String = "http://www.example.com:8888/"

Public Function CreateHttpObject() As Object
    Dim objweb As Object
    
    '各種名称でHTTPオブジェクトの生成を試みる
    Err.Clear
    Set objweb = CreateObject("MSXML2.ServerXMLHTTP.6.0")
    If Err.Number = 0 Then
        Set CreateHttpObject = objweb
        Exit Function
    End If
    
    
    Err.Clear
    Set objweb = CreateObject("MSXML2.ServerXMLHTTP")
    If Err.Number = 0 Then
        Set CreateHttpObject = objweb
        Exit Function
    End If
    
    
    Err.Clear
    Set objweb = CreateObject("MSXML2.XMLHTTP")
    If Err.Number = 0 Then
        Set CreateHttpObject = objweb
        Exit Function
    End If
    
    Set CreateHttpObject = Nothing

End Function

Public Function GetData(ByVal url As String) As String
    Dim objweb As Object
    
    'XMLHTTPオブジェクトを生成
    Set objweb = CreateHttpObject()
    
    'オブジェクトの生成に失敗していれば処理終了
    If objweb Is Nothing Then
        GetData = ""
        Exit Function
    End If
    
    objweb.Open "GET", TARGET_URL & url, False
    objweb.Send
    
    GetData = objweb.responseText
    
End Function

Public Function GetJSON(ByVal url As String) As JSON
    Dim data As String
    Dim obj As JSON
    
    data = GetData(url)
    
    If data = "" Then
        Set GetJSON = Nothing
        Exit Function
    End If
    
    Set obj = New JSON
    Call obj.Parse(data)
    
    Set GetJSON = obj
End Function





■JSON変換クラス

Private sc As Object
Private current_id As Long
Private max_id As Long

'コンストラクタ
Public Sub Class_Initialize()

    'コンストラクタで、JScriptオブジェクトを生成
    Set sc = CreateObject("ScriptControl")
    With sc
        .Language = "JScript"
        
        '指定したインデックス、名称のデータを取得する
        .AddCode "function getValue(index, name) { return ary[index][name];}"
        
        '配列数取得用
        .AddCode "function getLength() { return ary.length;}"
    End With
    
    current_id = -1
    max_id = 0
End Sub

'JSON形式のデータを解析する
Public Sub Parse(ByRef data As String)
    'aryというオブジェクトに取得したJSON形式のデータを展開
    sc.AddCode "var ary = " & data & ";"
    
    '配列数を確定
    max_id = sc.CodeObject.getLength("")
    
End Sub


Public Function HasNext() As Boolean
    current_id = current_id + 1
    HasNext = (current_id < max_id)
End Function


Public Function getValueAt(ByVal index As Long, ByVal id As String) As String
    getValueAt = sc.CodeObject.getValue(index, id)
End Function


Public Function getValue(ByVal id As String) As String
    getValue = getValueAt(current_id, id)
End Function

'デストラクタ
Public Sub Class_Terminate()
End Sub






実行結果



Excel起動時はこんな画面です。
07_002_20100917172303.png

検索ボタンを押すと、ちゃんとデータが取得できました。
07_003.png

データベースに新たな項目を追加すると・・・
07_004.png

検索を押すと反映されます。ちゃんとデータの取得が行えてます。
07_005.png












関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2010/09/21(火) 12:22:21|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<ExcelのVBAからWebアプリケーションにPOSTを実行する | ホーム | ExcelのVBAでJSON形式のデータを解析する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/580-112761f5
この記事にトラックバックする(FC2ブログユーザー)