ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2011年8月10日水曜日

GAE/Pのtemplateのextendsでちょっとはまった

Google App Engine (Python) のdjangoのテンプレートを使っていてちょっと躓いたことがあった。

私は、 http://www.aaharu.com/ というサイトを持っていますが、これはGAEで作っていて、DNSもGoogle Appsで設定しています。
お金がかかっているのはドメインだけ。

以前まではテンプレートを使わないでHTMLを表示していたわけですが、更新のたびにすべてのHTMLを変更するのが面倒になったので、テンプレートを使ってみることにしました。
GAEには標準でDjangoのテンプレートエンジンが入っていて、テンプレート継承の仕組みがあります。
http://djangoproject.jp/doc/ja/1.0/topics/templates.html
http://d.hatena.ne.jp/griefworker/20091028/gae_inherit_template

それで、テンプレート継承を使ってみたわけなのですが、HTMLの表示がくずれる現象が起きました。
HTMLのソースを表示させても問題は見当たらない。そしてなぜかOperaだけは正しく表示してくれる。

Chromeの『要素を検証』で確認してみると、どうやらbase.htmlの内容の前に空文字が挿入されているようだったので原因をいろいろ調べると、原因はUTF-8のBOMだった。
base.htmlがBOMありのUTF-8だったため、先頭の1文字を変な風に解釈していたようです。

というわけで、PythonでUTF-8扱うときはBOMは消そうと思いました。

2010年11月20日土曜日

ドリームキャスト起動画面のジェネレータ作ってみた

ドリキャスの起動画面をFlashで再現してみた。

DC startup generator

生成されたURL(http://www.aaharu.com/dcdata/DC.swf?w=eJzzSM3JyddRCM8vyklRBAAfngRqなど)に飛べば、その文字列をいつでも再現できます。

Flashのソースコードも公開してあります。
Python(GAE)のコードの一部がこれ。
class GenerateHandler(webapp.RequestHandler):
    def post(self):
        form = self.request.get('words')
        if len(form) < 2:
            path = os.path.join(os.path.dirname(__file__), 'index.html')
            self.response.out.write(template.render(path, {'alert': "2文字未満は未対応です・・・"}))
        else:
            form = zlib.compress(form.encode('utf_8'))
            form = b64encode(form)
            self.redirect("../dcdata/DC.swf?w="+form)

GETでswfに文字列を渡しているのですが、流れとしては
HTMLのformで文字列をPOSTで送信→Pythonでzlib(gzip)圧縮→PythonでBase64エンコード→GETで渡す→swfでGET受信→ActionScriptでBase64をByteArrayにデコード→ByteArrayを解凍→文字列に挿入
て感じです。ちょっと違う?