Bottleのルーティング機能を試す
スターサーバーでBottleを使ったページを表示させることができました。
今回は動的ルーティングを試しました。
サンプルプログラム
index.py
#!/usr/bin/python3.6 from bottle import route, run, template @route('/') def index(): return template("sample", name="テスト") ※ @route('/<name>') def test(name): return template("sample", name=name) run(server='cgi')
※ ルートディレクトリ/xxxにアクセスするとtest(name)が実行され、引数のnameにはxxxが設定される
sample.html
<html lang="ja"> <head> <title>サンプル</title> </head> <body> {{ name }} </body> </html>
これで/xxxにアクセスすると画面上にxxxが表示されるはずなのですが・・・
404エラーになりました。
index.pyにアクセスできていないようですね。
下記のようにURLを変更すれば表示されるようになりました。
/index.py/xxx
日本語も大丈夫
/index.py/テスト
しかしできるならドキュメントルート+ "/xxx"でちゃんと表示されるようにしたいですね。
.htaccessに下記を追加してURLをリライトするようにします。
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.py$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.py/%{REQUEST_URI} [L] </IfModule>
/xxxにアクセスするとURLの表示内容は変わらないけど裏では /index.py/xxxにアクセスするようになります。
.htaccessを更新して/xxxにアクセスすると
表示されました。
index.pyをコントローラにすれば動的なページの作成も簡単に実装できそうです。
スターサーバーでBottleを使ってPythonで作成したページが表示されるか?
前回スターサーバーでPythonで実装したページを表示させることができました。
今回はPythonのいくつかあるフレームワークをスターサーバーで動かせるかを試してみます。
各フレームワークの特徴
Djangoは最も普及していて多機能
FlaskはDjangoより機能が絞られていて軽量
Bottleは一番機能がシンプルで軽量
Django、Flaskは公式からファイルをダウンロードして配置というわけにはいかず、
pipコマンドというインストール用のコマンドを実行する必要があるので
レンタルサーバーに導入できるか微妙
Bottleは1ファイルだけの構成なのでダウンロードしたファイルをサーバーに
アップロードすれば使えずはず
ということで使うフレームワークはBottleに決定
Bottleのダウンロードと設定変更
公式サイトからbottle.pyをダウンロードする。
Download and Installのbottle.pyをクリックすればダウンロードできます。
bottle.pyのコマンドパスを変更
!/usr/bin/python3.6
サンプルプログラム
index.py
#!/usr/bin/python3.6 # ※1 from bottle import route, run, template # ※2 @route('/') def index(): return template("sample", name="テスト") # ※3 run(server='cgi')
※1 同じ階層にあるbottle.pyから route, run, templateという名前の関数をインポート
※2 ドキュメントルートにアクセスするとindex()が実行される
sample.html
htmlはテンプレートとして作成します
<html lang="ja"> <head> <title>サンプル</title> </head> <body> {{ name }} </body> </html>
index.pyの下記の個所でテンプレートを読み込んでname部分を"テスト"に置換して出力されるようにしてます。
return template("sample", name="テスト")
なお、bottle.pyのソースを確認すると、テンプレートを配置するディレクトリはデフォルトでは同じ階層かviewという名前のディレクトリになります。
テンプレートの拡張子は'tpl', 'html', 'thtml', 'stpl'のようです。
サーバーにアップロード
この状態でアクセスすると
無事表示されました。
まとめ
意外と簡単にBottleを使って画面が表示できました。
テンプレートもシンプルで分かりやすいのでループを使ったりdict型のデータで置換できたりする方法が分かれば
個人のページのような規模の小さいページ作るならBottleはありかなと思いました。
スターサーバーでPythonをテストした時のこと
スターサーバーでPythonで実装したページを表示させた時のメモです
.htaccessの作成
Pythonで実装したプログラムをCGIスクリプトとして扱うために
.htaccessを作成し以下を追記する
AddHandler cgi-script .py DirectoryIndex index.php index.html index.py
2行目はindex.pyをデフォルトドキュメントにするための設定
サンプルプログラム1
#!/usr/bin/python3.6 print("Content-Type: text/html; charset=utf-8") print("<html><meta charset='utf-8'><body>") print("<h1>テストページ</h1>") print("</body></html>")
サーバーにアップロード
実行権限与えないと500エラーが発生するみたいなので権限を付与してます
この状態でindex.pyにアクセスしてみると・・・
500エラーが発生
改行コードはLFでないと500エラーが発生するという情報があったのでCRLFからLFに変えて再度試すも解消せず
サンプルプログラム2
#!/usr/bin/python3.6 print("Content-Type: text/html; charset=utf-8\n") print("<html><meta charset='utf-8'><body>") print("<h1>テストページ</h1>") print("</body></html>")
Content-Typeの最後に改行がないと500エラーが発生するという情報があったので改行を追加
この状態でindex.pyにアクセスしてみると・・・
500エラーは発生しないが真っ白
ソースを確認してみると
body以降が出力されていない
怪しいのは日本語出力か?
ということでまたまた修正
サンプルプログラム3
#!/usr/bin/python3.6 print("Content-Type: text/html; charset=utf-8\n") print("<html><meta charset='utf-8'><body>") print("<h1>aaa</h1>") print("</body></html>\r\n")
やはり日本語が問題でした
標準出力をエンコードすれば日本語が出力できるようになるみたいなので修正
サンプルプログラム3
#!/usr/bin/python3.6 import sys, io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding = 'utf-8') print("Content-Type: text/html; charset=utf-8\n") print("<html><meta charset='utf-8'><body>") print("<h1>テストページ</h1>") print("</body></html>")
日本語が出力されました。