Zipファイル一個で実行可能なPythonアプリケーションを作ってみる - 第2夜

さて、先日 http://d.hatena.ne.jp/atsuoishimoto/20120503/1336050988 を紹介したが、Flaskアプリケーションの Blueprint 機能を使うと正しく動作しないようだ。Blueprintでは独自にテンプレートや静的ファイルのディレクトリを指定できるようになっているため、こちらも対処する必要があるのだ。

ということで、

class ResourceMixin(object):
    PACKAGENAME = "demo_pkgrsrc"
    
    @helpers.locked_cached_property
    def jinja_loader(self):
        return loaders.PackageLoader(self.PACKAGENAME, self.template_folder)

    def send_static_file(self, filename):
        fname = helpers.safe_join(self._static_folder, filename)
        f = pkg_resources.resource_stream(self.PACKAGENAME, fname)
        return helpers.send_file(f, attachment_filename=filename)

のような、リソースAPIを呼び出すためのクラスを作成しておき、アプリケーションやBlueprintはこのクラスを利用して

class ZippedFlask(ResourceMixin, Flask):
    pass

app = ZippedFlask(__name__)

class ZippedBlueprint(ResourceMixin, Blueprint):
    pass

blueprint = ZippedBlueprint('blueprint_test', __name__, 
    template_folder='templates2', 
    static_folder='blueprint_static', 
    static_url_path='/static2')

if __name__ == "__main__":
    app.run()

などとすると良いようだ。


※ ここで作成したファイルは https://github.com/atsuoishimoto/demo_pkgrsrc に置いてあるのでご参照いただきたい。