スターサーバーで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>")
日本語が出力されました。
M1チップ搭載MacBook Airを購入したので開発環境を構築してみる
楽天モバイルは屋内に弱い?
自宅で使った感想
9/7よりRakuten UN-LIMITを使い始めました。
Google Pixel 4aにSIMを入れてまずは自宅で速度計測。
データ高速モードをOFFにしてパートナー回線エリアでの最大通信速度を1Mbpsに制限した状態なので楽天回線に繋がってるはずです。
速度は問題なし。
テザリングをONにして職場のPCにリモート接続して作業して一週間、特に大きな問題はありませんでした。
自宅でモバイルルーターにSIM入れて運用する分には問題ないと思います。
モバイルルーターはNECのMR05LNを検討中。
楽天モバイルの公式で買うよりも他で買った方が安いのでYahooショッピング辺りで購入すると思います。
違いはAPN自動設定されるかどうかだけみたいなので。
自宅以外で使った感想
自宅では問題ありませんでしたが、自宅以外だといろいろ問題が発生しました。
屋外は問題なく繋がり速度も問題ないです。
しかし自宅近くのローソン店内の奥に行くと繋がりませんでした。
レジ付近でも繋がらないのでモバイルPontaやキャッシュレス決済使用時に画面が表示できなくて困りました。
パートナー回線にも繋がらなかったのでこれは大きな問題です。
同じ現象がLINKS UMEDAのHarvesのレジ付近でも発生しました。
自宅近くのよく使う飲食店でも繋がるところと繋がらないところが半々と言ったところでしょうか。
こればかりは今後の設備増強による改善を期待するしかないですね。