Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Bottleで静的ファイルを表示する

Bottleで静的ファイルを表示する方法です。
固定のpdfファイルや画像ファイルを表示させる時なんかに使います。
ローカルのImageMagicで生成したファイルをブラウザに渡すときにも重宝しそうですね。

実際のところ

imageディレクトリからgopherくんの固定ファイルを表示するアプリケーションを想定します

元画像

File:Go gopher mascot bw.png - Wikimedia Commonsから、gopherくんの128pixelのを導入します。
f:id:shuzo_kino:20160905204731p:plain

スクリプト本体

from bottle import get, run, static_file
from time import strftime

@get('/image/<filename:re:.*\.png>')
def send_image(filename):
    return static_file(filename, root='/Users/shuzo_kino/python/image', mimetype='image/png')

run(host='localhost', port=8080)

動作確認

http://localhost:8080/image/gopher.pngにアクセスすれば、例のgopherくんが表示されます。

【イベントレポ】大ゴジラ特撮王国YOKOHAMAに行ってきました

ゴジラ特撮王国YOKOHAMAに行って来ました。
大都会横浜、そのシンボルたるランドマークタワーでの開催です。
田舎者の僕にとっては移動だけでちょっとした旅行気分。

会場の様子

館内は一部小物以外は基本的に撮影OK。
AR体験があったりと体験型ブースもあったりと展示以外にも楽しめるイベントでした。

python版sinatraな軽量WEBフレームワークbottle

bottleはsinatraな軽量WEBフレームワークです。
getメソッドの取扱いレベルまで小分けされているので、限界域まで軽く作ることができます。

導入

例の如く、pipで。依存パッケージは無いように設計されているみたいです。

$ pip install bottle

依存がなく、軽量……ということは直接導入という荒業も。
200kbyte程度なので、ワザワザpipを入れるほどでは……という場合にも重宝。

$ curl -O https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py

スクリプト本体

以下の構成の、簡単なアプリを考えてみます。

  • "~/hello/"でユーザに挨拶
  • "~/time"で現在時刻

bottleから"get"、"run"、"template"を拝借し、標準ライブラリのtimeを使って以下のように書きます。

from bottle import get, run, template
from time import strftime

@get('/hello/<name>')
def hello(name):
    return template('<b>Hello {{name}}</b>!', name=name)

@get('/time')
def show_time():
    return strftime('<p>%m-%d_%H:%M:%S_%Z</p>')

run(host='localhost', port=8080)

実行

$ python app.py

http://localhost:8080/timeにアクセスすると、"09-03_23:24:14_JST"みたいな文字列が
http://localhost:8080/hello/shuzoだと"Hello shuzo!"てな文字が太字で出てきます。

commonprefixは共通部分を引っ張りだす

標準ライブラリosにくっついてるcommonprefixはパスの共通部分を抽出してくれる関数です。

実際のところ

import os
os.path.commonprefix(["/home/shuzo_kino/python", "/home/shuzo_kino/Downloads"])
#>> '/home/shuzo_kino/'

本来的な要素では無いのでしょうが、ためしにURLでやってみたところ……動きました

os.path.commonprefix(["http://hoge.foo/fuga.html", "http://hoge.foo/nya.html"])
#>> 'http://hoge.foo/'

日本語でも。URIをパースしてるというより、共通部分を抽出しているだけのようですね。

os.path.commonprefix(["会津藩", "会津若松市"])
'会津'

pythonで現在のディレクトリを知る

使い捨て便利アプリを作ってるとき、問題になったりする現在地。
pythonの標準ライブラリosがその辺りをよろしくやる関数を提供してくれます。

実際のところ

curdirは現在ディレクトリの相対パスを示す記号……"."を返すだけです。

import os

os.path.curdir
#>> '.'

現在のディレクトリの絶対パス知りたい場合はabspath関数を使いましょう

import os
os.path.abspath(".")
#>> '/Users/shuzo_kino/python'

標準ライブラリgetpathはパスワード入力画面を実装できる

getpathはパスワード入力を支援する標準ライブラリです。
Pythonはデフォでこんなもんが付いてるんですね……。

実際のところ

例のごとく、importするだけ。
関数はユーザ名を抑えるgetuserとパスワードを入力するgetpass。

import getpass
getpass.getuser()
#>> 'shuzo_kino'

getpass.getpass()
#>> Password: 
#>> 'yes'

urljoinでURL文字列の細工をする

urljoinはURL文字列を細工する関数です。
同一ドメイン上のページを行ったり来たりする用途なんかには向いてるかも知れませんね。

公式リファレンスでは以下のように紹介されています。

“基底 URL”(base)と別のURL(url)を組み合わせて、完全な URL (“絶対 URL”) を構成します。

実際のところ

ParseResultで言う処の、pathに相当する部分を差し替えることができます。

from urllib.parse import urljoin

url = "https://ja.wikipedia.org/wiki/宇奈月温泉"
res2 = urljoin(url, "/wiki/ファイル:Pcs34560_IMG4098.JPG")

print(url)
print(res2)

実行してみるとこんな感じ

$ python url.py 
https://ja.wikipedia.org/wiki/宇奈月温泉
https://ja.wikipedia.org/wiki/ファイル:Pcs34560_IMG4098.JPG