PythonのBottleフレームワークで静的ファイルのリンク生成
Bottleフレームワークを触ってみてます。Pythonの軽量Webフレームワーク「Bottle」
上記で作成したサンプルに画像を表示しようとした時事件が・・・
よくある問題
staticというフォルダを作成し、image.jpgを保存。
それを表示しようと、こんなプログラムとテンプレートを作成しました。
index.py
- # -*- coding:utf-8 -*-
- from bottle import route, run, view, static_file
- @route('/static/<filepath:path>')
- def static(filepath):
- return static_file(filepath, root="./static")
- @route('/<name>/<count:int>')
- @view("hello_template")
- def hello(name, count):
- return dict(name=name, count=count)
- run(host='localhost', port=8080, debug=True, reloader=True)
hello_template.tpl
こんにちは。<b>{{name}}</b>さん。<br />
<br />
{{count}}回ループするよ<br />
<br />
% for i in xrange(count):
{{i}}回<br />
% end
<img src="./static/image.jpg">
これだと、画像は表示されません。
最初よくわからなかったのですが、冷静に考えれば当たり前で
表示しているURL
http://localhost:8080/symfoware/1
./static/image.jpgはフルのURLに直すと
http://localhost:8080/symfoware/static/image.jpg
狙っているURLは
http://localhost:8080/static/image.jpg
そりゃ表示されません。
じゃあ、../../static/image.jpgにすればいいんですけど、そういう問題でもないし。
解決方法
ここがヒントになりました。
Static files not loaded in a Bottle application when the trailing slash is omitted
若干Bottleのバージョンが古いようで、そのままでは動きませんでしたが、
要するにget_urlっていうメソッドがあるから、それを使えばいい感じになると。
ただ、get_urlはテンプレートじゃ使えないから関数をパラメーターとして渡してね。
という感じです。
Bottle ver0.11で動かしたコードはこんな感じ。
index.py
- from bottle import route, run, view, static_file, url
- @route('/static/<filepath:path>', name='static_file')
- def static(filepath):
- return static_file(filepath, root="./static")
- @route('/<name>/<count:int>')
- @view("hello_template")
- def hello(name, count):
- return dict(name=name, count=count, url=url)
- run(host='localhost', port=8080, debug=True, reloader=True)
hello_template.tpl
こんにちは。<b>{{name}}</b>さん。<br />
<br />
{{count}}回ループするよ<br />
<br />
% for i in xrange(count):
{{i}}回<br />
% end
<img src="{{url('static_file', filepath="image.jpg")}}">
まず、get_urlはBottleクラスに移動されていました。
しかし、ソースを見ると
- def make_default_app_wrapper(name):
- ''' Return a callable that relays calls to the current default app. '''
- @functools.wraps(getattr(Bottle, name))
- def wrapper(*a, **ka):
- return getattr(app(), name)(*a, **ka)
- return wrapper
- # (略)
- url = make_default_app_wrapper('get_url')
こんな感じで、urlとしてラップされていますので、「url」を使用します。
また、@routeは「name」で名前をつけることができます。
このnameで指定した名称で、urlメソッドから変換したいurlのポイントを指定します。
urlメソッドの引数は、
url(@routeで指定したname, [引数の名称] = "値")
こんなイメージです。
ソースを修正して表示してみると、見事画像が表示されました。
これ、画像以外のcssやjsでも発生する問題だと思います。
解決できてよかった。
- 関連記事
-
- 単機能コードスニペットツール「Danpen」をapache + mod_wsgiで動かす
- Apache + mod_wsgiでBottleフレームワークのアプリケーションを動かす
- PythonのBottleフレームワークで静的ファイルのリンク生成
- Pythonの軽量Webフレームワーク「Bottle」
- hgコマンドでBitbucketにプッシュする
コメント