2014年7月4日金曜日

bottle環境で静的ファイルを扱う

bottleでは、静的ファイルへのルーティングをする為に、コードを書いてあげないといけません。静的ファイルというのは、例えばスタイルシートや画像ファイルなんかですね。

前提ディレクトリ構造


今回は以下ディレクトリ構造を想定します。

(dev001)kitabat@clientX% tree work
work
├── hello.py
└── static
    ├── css
    │   └── default.css
    └── img
        └── city.jpg

3 directories, 3 files

hello.pyを実行するディレクトリ(/home/kitabat/dev001/work)が、'/' でアクセスされた際のディレクトリになります。
この状態で、http://192.168.56.103:8080/static/img/city.jpg にアクセスしても、、、エラーになるのです。もちろん、前述の通り、静的ファイルへのルーティングが無いからですね。



静的ファイルへのルーティングコード追加


こんな感じです。
from bottle import route, run, static_file

@route('/')
@route('/<hoge>')
def hello(hoge="root"):
    return "Hello World!<br> path is " + hoge

@route('/file/<filename:path>')
def static(filename):
    return static_file(filename, root="/home/kitabat/dev001/work/static")

run(host='0.0.0.0', port=8080, debug=True, reloader=True)

まず1行目。static_fileというbottleの機能を使うので読み込みます。3〜6行目は今までに書いた部分。8〜10行目が今回追記したルーティング用コードです。
8行目の file/<filename:path> について。< >は前回説明した通り、アクセスされたURLを以後の関数内で使うための書き方です。:pathはfilenameに、パスを含んで良い事を意味します。単純に<filename>だけだった場合、/file/img/city.jpg へのアクセスは上手く行かず404になります。filenameに格納される部分が "img/city.jpg" と、パスを含むからですね。
10行目でstatic_file()関数を使います。第1引数が静的ファイル名、第2引数が、root=サーバのローカルパスです。

では、http://192.168.56.103:8080/file/img/city.jpg にアクセスしてみると、、、



やった〜!

注意すべき点として、アクセスするURLと、サーバ側のローカルパスは一致させる必要が無いので、混乱しないように、くらいですかね。今回はあえて、アクセスURL側を "file"、実際のディレクトリ側を "staic" としておりました。


ではまた。

0 件のコメント:

コメントを投稿