SSHが使えないレンタルサーバにて、Webアプリを作る機会がありました。
SSHが使えないのでパッケージを入れることができないことから、ダウンロードすれば使えるフレームワークを探してみました。
すると、PythonのBottleというWeb frameworkが1ファイルで動作しそうなことが分かり、また同じようなレンタルサーバでも動作した実績がありました。
- bottlepy/bottle - GitHub
- Pythonの軽量WebフレームワークBottleを試してみた(その1) - ルーティング編 (Advent Calendar 23日目) | アライドアーキテクツ エンジニアブログ
- PythonのWebフレームワーク Bottleをロリポップサーバ(ロリポプラン)で動かしてみる - Qiita
幸いにも、手元のレンタルサーバではBottleの動作条件を満たしていたことから、動かしてみることにしました。
環境
レンタルサーバ
- SSHによる接続不可
- Python 2.x系
- Apache 2系
- 使用できるディレクトリは以下の通り
- 一般のhtmlとかは
htdocs
の下 - CGIは専用ディレクトリの下(
<your_host>/cgi/
など)
- 一般のhtmlとかは
.htaccess
ファイルによる設定可能
開発環境
環境調査
.htaccessの確認
FFFTPで接続したところ、
425 Unable to build data connection: Operation not permitted
というエラーになりました。
ドキュメントを見ると暗号化してはいけなさそうなので、FFFTPのHost Settingより、Host Setting > Encryption にある、Allow to connect without encryption にチェックを入れました。
再度FFFTPにて接続したところ、.htaccess
ファイルがありました。中身を確認したところ、
AddType application/x-httpd-php .php Options -Indexes SetEnv TZ JST-9
のような設定になっていました。
mod_pythonの確認
レンタルサーバ上でPythonがCGI・mod_pythonのどちらで動作しているか分からなかったため、以下を参考に確認してみました。
なお、mod_pythonはmod_python.c
を指定すれば良さそうでした。
2.3.2 Configuring Apache - modpython.org
<IfModule mod_python.c> ErrorDocument 404 http://www.google.co.jp/ </IfModule>
その状態で存在しないURLへとアクセスしてもGoogleへは飛ばされなかったため、CGIで動作しているようでした。
Pythonスクリプトの動作確認
cgiディレクトリに入れた時の動作
以下を参考に、Pythonが動作するかを確認します。
Python CGIプログラミング入門 - Python CGIプログラミング入門
なお、Shebang(シバン)の内容は、レンタルサーバのドキュメントを参考に指定します。
#!/usr/bin/env python # -*- coding: utf-8 -*- print "Content-Type: text/plain;charset=utf-8" print print "test"
上記のファイルをレンタルサーバへとアップロードし、レンタルサーバのドキュメントを参考にパーミッションを変更します。
その状態で http://<your_host>/cgi/test.py
へとアクセスすると、ブラウザ上にtest
と表示されました。
また、test.cgi
とリネーム・アップロード後、http://<your_host>/cgi/test.cgi
へとアクセスした場合も、同じように動作しました。
htdocsディレクトリに入れた時の動作
同じようにして、htdocsディレクトリに入れ、http://<your_host>/test.py
へとアクセスしてみると、Pythonスクリプトのコードが表示され、Pythonスクリプトが動作していないようでした。
一方、http://<your_host>/test.cgi
と入力したところ、Pythonスクリプトとして動作していました。
htdocsディレクトリでもPythonスクリプト(.py)を実行可能にする
.htaccessにAddHandlerを追加します。
ただ、そのままではexample.py.html
のようなファイルもPythonスクリプトとしてみなされてしまいます。
そのため、以下を参考に、<FilesMatch>
を使って.py
ファイルのみPythonスクリプトとして扱うようにしました。
ApacheのAddHandlerはセキュリティ上の懸念から使用すべきではない - Dマイナー志向
.htaccess全体は以下の通りになりました。
AddType application/x-httpd-php .php Options -Indexes SetEnv TZ JST-9 <FilesMatch \.py$> SetHandler cgi-script </FilesMatch>
Bottleの動作確認
インストール
Bottleは1ファイルで動作するため、pipを使う必要はありません。
そのため、PyPIより現時点での最新版のbottle-0.12.8.tar.gz
をダウンロードして展開します。
Index of Packages : Python Package Index
また、レンタルサーバのドキュメントで、文字コードはutf-8
、改行コードはLF
と指定されていたので、bottle.py
を開いて文字コード・改行コードを変更します。
Visual Studio Codeの場合、画面右下の文字コードや改行コードの表示をクリックすれば変更することができました。
Bottleを使ったアプリの作成
BootleのドキュメントにあるスクリプトをCGIで動くように修正します。なお、ファイル名はtest.py
としました。
#!/usr/bin/env python # -*- coding: utf-8 -*- import os from bottle import route, run, template @route('/hello/<name>') def index(name): return template('<b>Hello {{name}}</b>!', name=name) if os.name == 'nt': # for local (Windows) run(host='0.0.0.0', port=8080, debug=True) else: # for production (Linux) run(server='cgi')
その後、レンタルサーバへとアップロードし、パーミッションを変更します。なお、ディレクトリ構成は以下の通りです。
www\ ├── cgi\ └── htdocs\ ├── .htaccess ├── bottle.py └── test.py
動作確認
http://<your_host>/test.py/hello/world
へとアクセスしてページのソースを見ると、
<b>Hello world</b>!
となっていました。
これにより、Bottleが動作していることを確認できました。