万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

2012 Pythonアドベントカレンダー(Webフレームワーク)「Tornado&Titanium連携」

URL: http://connpass.com/event/1439/


shinriyoです。万年素人のエンジニアです。(自称クラフトマン)


普段はUnityというゲームエンジンでゲーム開発してます。
しかも、UnityScriptというクソ言語(C#で実装されたBooというPythonモドキの言語で実装されたJSモドキの言語)で書いてます。


Pythonは趣味とたまにちょっとしたツール書くくらいですね。そのBooというPythonモドキの言語もたまに嗜みますよ。


土日も一日中仕事で、UnityBooアドベントカレンダーを立てたけど
あまり参加してくれなくてほぼ一人で書いてて時間がとれません。
※朝は寒くて早起きできません・・・


オライリーの洋書もまだ翻訳されてない(途中まで個人で訳したけどw)Tornadoを使いたいと思います。

このTornadoと、Titaniumとの連携を行なっていきます。
レベルは初心者向けの内容です。(virtualenv入ってる前提で話し進めますよ)

・まずTornadoインストール

workon pyfes2012 
pip install tornado

※今回はpyfes2012とは関係ないですが、沢山インストールされるのが嫌なので、私は「pyfes2012」をなんでも屋vertual環境にしていますので気にしないでください。



Titaniumは調子が悪くてTitanium Mobileで何故か新規プロジェクトを作成できなくなってるので、
Titaniumのプロジェクトをコピーします。(僕の環境がおかしいだけなので真似しなくていいです普通にTitaniumで新規プロジェクト作ってね)

cp -rf omikuji tornado_test

私の環境はなぜかコンパイルもできなくなってしまってるので、MakeTiというのを使ってます。
※詳しくは過去の私の記事見てね。
 → Titnaium Mobileがおかしい時にも使用出来るツール



Tornadoに話を戻します。

mkdir tornado
cd tornado


・hello.py
※某動物外資系技術書のコードのパクリだろ?ってツッコミはなしで。

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('argument', 'Hello')
        self.write(greeting + ', Titanium!')

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

・実行します

python hello.py --port=8000

ブラウザではこうアクセスして見えます。
GETパラメータなし

GETパラメータあり



◯Titaniumのコードです
・Resources/app.js

var tabGroup = Ti.UI.createTabGroup();

var win1 = Ti.UI.createWindow({
    title: 'win 1',
    backgroundColor: 'blue'
});

var data = [
    {title:'Tornado Test', hasChild:true, dest:'album.js'},
];
var table = Ti.UI.createTableView({
    data: data
});

table.addEventListener('click', function(e){
    if (e.rowData.hasChild) {
        var w = Ti.UI.createWindow({
            url: e.rowData.dest,
            title: e.rowData.title,
            backgroundColor: 'white'
        });
        tab.open(w); // call back
    }
});
var view = Ti.UI.createView();
view.add(table);
win1.add(view);

var tab = Ti.UI.createTab({
    icon: 'KS_nav_views.png',
    title: 'Tab 1',
    window: win1
});
tabGroup.addTab(tab);
tabGroup.open();

Ti.API.info(tabGroup.tabs[0].title);

・Resources/album.js

var view = Ti.UI.createView();
var label = Ti.UI.createLabel({
    color: '#F00',
    text: 'album',
    height: 32,
    width: 150,
    top: 120
});

// from server
var xhr = Titanium.Network.createHTTPClient();
var myURL = 'http://localhost:8000/?argument=';
var param = 'ひきすう';

// 第1引数はHTTP Method
// 第2引数はURIです。
xhr.open('GET', myURL +param);

xhr.onload = function() {
    label.text = xhr.responseText;
}

// リクエスト送信します。(引数としてJSON値を入れるとパラメータ化される)
xhr.send(); // 必須

view.add(label);
Ti.UI.currentWindow.add(label);


・結果↓

このように値がとれます。赤い文字で出ますね。


今後これを応用すれば、いろいろ作れると思います。今回はあくまで基本です

TitaniumのAdvent CalenderではないのにPythonのコードより長いのは気のせいです、すみません。

それでは次回15日は@jbkingさんお願いします。