これまでのおさらい
前回と前々回で、さくらのレンタルサーバーで最安プランであるライトを契約し、CGIしか使えない所をBottleという1ファイルで実装されているWebフレームワークを用いて、SQLiteと組み合わせて動的Webページを実現しました。
CookieやHTTPヘッダ周り、GETやPOSTでのリクエストへの応答などBottleをCGIで使ってみました。
ここらで、一度返却するHTML(コンテンツ)にフォーカスしてみたいと思います。
本稿で取り扱うのは以下の4つです。
- 静的ページ
- エラーページ
- abort
- redirect
静的ファイル
コンテンツを静的ページとして用意した場合に、それをBottleでサーブさせる方法を試して見たいと思います。
CGIでBottleを動かしているということは、静的コンテンツはCGI以外で普通に取り扱えば良いのでは?という話もあるかもしません。
ですが、認証されていることを前提に静的コンテンツを開示したり、ユーザーの状態に応じて異なる静的コンテンツを開示するなど、とにかくコンテンツは静的ではあるもののその前段にロジックが必要となるケースもあるかと思いますので、是非押さえておきたいと思います。
from bottle import static_file @route('/static/<filename>') def server_static(filename): return static_file(filename, root='/path/to/your/static/files')
rootで指定するのは絶対パスにしています。相対パスでの指定も可能となっていますが「常にワーキングディレクトリとプロジェクトディレクトリは一致していないので…」というなんとなくそういうことかな?ってイメージすることは出来ますが、とにかく絶対パスを指定すれば問題無いと思います。
エラーページ
つづいては、エラーページです。こちらは単純にリクエストされたURLに対して返却するリソースがない場合に使用する”404 File Not Found”や、アプリケーションロジックでエラーが発生した場合に用いる”500 Internal Server Error”等です。
404エラー
まずは404エラーの例です。
from bottle import error @error(404) def error404(error): return '404 File Not Found'
実際にあり得ないURLでアクセスしてみます。
500エラー
次に、500エラーの例です。
from bottle import error @error(500) def error500(error): return '500 Internal Server Error'
/helloにアクセスするともれなく例外が発生するコードをテストのために用意します。
@route('/hello') def hello(): raise Exception("Error!!!") return "Hello World!"
ブラウザで/helloにアクセスしてみると、画面には500 Internal Server Errorとしての画面が返却されます。
実際に、Exceptionが発生しているのが確認できます。
404エラーも500エラーも1行の簡単な文字列を返却していますが、実際には<html>〜</html>を返却することでHTMLを返却することが可能です。
abort
エラーが起こったときに簡単にエラーページを生成するための機能です。
from bottle import route, abort @route('/error') def error_page(): abort(500, "500エラー")
実際にアクセスしてみると、以下の様なページが返却されます。
ただし、前回取り上げたerrorを同時に実装していた場合には、そちらのページが返却されます。
from bottle import error @error(500) def error500(error): return '<html><head><title>たいとる</title></head><body>500 Internal Server Error</body></html'
実際に確認してみます。
redirect
例としては誤ったURLにアクセスすると正しいURLにリダイレクトされるというイメージの例になっていますが、実際には「ログイン未済の状態と判定されてログイン画面へ」などWebアプリを作成する上で必須の機能だと思います。
from bottle import redirect @route('/wrong/url') def wrong(): redirect("/right/url")
以下は、”/right/url”を”/select”に変更して実行した例です。
まとめ
- 静的ページ
- エラーページ
- abort
- redirect
以上の4つを取り扱いました。テンプレートについては次回取り上げたいと思います。