インストール
pip でインストール。
takatoh@apostrophe $ pip install bottle Collecting bottle /usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. InsecurePlatformWarning Downloading bottle-0.12.10-py2-none-any.whl (88kB) 100% |████████████████████████████████| 90kB 3.6MB/s Installing collected packages: bottle Exception: Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/pip/basecommand.py", line 211, in main status = self.run(options, args) File "/usr/local/lib/python2.7/dist-packages/pip/commands/install.py", line 311, in run root=options.root_path, File "/usr/local/lib/python2.7/dist-packages/pip/req/req_set.py", line 646, in install **kwargs File "/usr/local/lib/python2.7/dist-packages/pip/req/req_install.py", line 803, in install self.move_wheel_files(self.source_dir, root=root) File "/usr/local/lib/python2.7/dist-packages/pip/req/req_install.py", line 998, in move_wheel_files isolated=self.isolated, File "/usr/local/lib/python2.7/dist-packages/pip/wheel.py", line 339, in move_wheel_files clobber(source, lib_dir, True) File "/usr/local/lib/python2.7/dist-packages/pip/wheel.py", line 317, in clobber shutil.copyfile(srcfile, destfile) File "/usr/lib/python2.7/shutil.py", line 83, in copyfile with open(dst, 'wb') as fdst: IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/bottle.py' You are using pip version 7.1.2, however version 9.0.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command.
って、えー、なんかいきなりエラーが出るじゃん。pip をアップグレードしろ、といってるみたいなので、そうしてみる。
takatoh@apostrophe $ pip install --upgrade pip /usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. InsecurePlatformWarning Collecting pip Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB) 100% |████████████████████████████████| 1.3MB 451kB/s Installing collected packages: pip Found existing installation: pip 7.1.2 Uninstalling pip-7.1.2: Exception: Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/pip/basecommand.py", line 211, in main status = self.run(options, args) File "/usr/local/lib/python2.7/dist-packages/pip/commands/install.py", line 311, in run root=options.root_path, File "/usr/local/lib/python2.7/dist-packages/pip/req/req_set.py", line 640, in install requirement.uninstall(auto_confirm=True) File "/usr/local/lib/python2.7/dist-packages/pip/req/req_install.py", line 716, in uninstall paths_to_remove.remove(auto_confirm) File "/usr/local/lib/python2.7/dist-packages/pip/req/req_uninstall.py", line 125, in remove renames(path, new_path) File "/usr/local/lib/python2.7/dist-packages/pip/utils/__init__.py", line 315, in renames shutil.move(old, new) File "/usr/lib/python2.7/shutil.py", line 303, in move os.unlink(src) OSError: [Errno 13] Permission denied: '/usr/bin/pip' You are using pip version 7.1.2, however version 9.0.1 is available. You should consider upgrading via the 'pip install --upgrade pip' command.
ダメじゃん。同じようなエラーが出る。
ググってみると↓このページを見つけた。
なんか、pip でインストールしようとするのが間違いみたいなことが書いてある。bottle はファイル1つでできているので、それをダウンロードして、スクリプトと同じディレクトリに置くのが簡単らしい。
https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py
takatoh@apostrophe $ wget https://raw.githubusercontent.com/bottlepy/bottle/master/bottle.py
これで bottle.py がダウンロードできた。なんか釈然としないけど今のところはよしとする。
Hello, world!
まず初めは、定石通り Hello, world。
from bottle import route, run @route('/hello') def hello(): return "Hello, world!" run(host='localhost', port='8080', debug=True)
bottle から route
と run
をインポート。route
デコレータでルーティングを行い、run
関数でサーバを走らせる、ってことのようだ。
これで http://localhost:8080/hello にブラウザでアクセスすると、ちゃんと「Hello, world!」と表示された。
パス中にパラメータ
URL のパス中にパラメータを入れることができる。下の < > で囲んであるところがそれ。
from bottle import route, run @route('/hello/') def hello_with_name(name): return "Hello, " + name + "!" run(host='localhost', port='8080', debug=True)
例えば、http://localhost:8080/hello/Andy にアクセスすると「Hello, Andy!」と返ってくる。
リダイレクト
redirect
関数を使う。
from bottle import route, redirect, run @route('/') def index(): redirect('/hello') @route('/hello') def hello(): return "Hello, world!" run(host='localhost', port='8080', debug=True, reloader=True)
ついでに、run
関数の引数に reloader=True
を指定した。これによって、サーバを起動したままでもファイルを書き換えると自動的にリロードしてくれるようになる。
Not found
abort
関数。ステータスコードとメッセージを指定できる。
from bottle import route, redirect, abort, run @route('/') def index(): redirect('/hello') @route('/hello') def hello(): abort(404, "Not Found.") run(host='localhost', port='8080', debug=True, reloader=True)
この例では、http://localhost:8080/ にアクセスすると /hello にリダイレクトされて、Not found になる。
リファラと接続元IPアドレス
request
オブジェクトからリクエストの情報が取れる。リファラは request.headers.get('Referer')
。
# encoding: utf-8 from bottle import route, request, run @route('/') def index(): return "<a href="\"./ref\"">Link</a>" @route('/ref') def ref(): referer = request.headers.get('Referer') return referer run(host='localhost', port='8080', debug=True, reloader=True)
一方、IPアドレスは request.environ.get('REMOTE_ADDR')
。
# encoding: utf-8 from bottle import route, request, run @route('/my_ip') def my_ip(): ip = request.environ.get('REMOTE_ADDR') return ip run(host='localhost', port='8080', debug=True, reloader=True)
テンプレート
bottle
から template
をインポートすることで、簡易なテンプレートエンジンが使えるようになる。
# encoding: utf-8 from bottle import route, request, template, run @route('/') def index(): return "<a href="\"./ref\"">Link</a>" @route('/ref') def ref(): ip = request.environ.get('REMOTE_ADDR') referer = request.headers.get('Referer') or '' return template("Your IP is {{ip}}, referer is {{referer}}.", ip=ip, referer=referer) run(host='localhost', port='8080', debug=True, reloader=True)
静的ファイル
static_file 関数を使う。
# encoding: utf-8 from bottle import route, static_file, run @route('/') def static(file_path): return static_file(file_path, root='./storage', download=True) run(host='localhost', port='8080', degug=True, reloader=True)
引数に download=True
を指定すると、ブラウザで開くのではなくダウンロードするようになる。
ふう、今日のところはここまで。
[追記]
Windows 10 では、pip
で普通にインストールできた。なんでだ?
[追記2]
sudo
をつけたら、pip
のアップグレードも bottle
のインストールもうまくいった。