目的
サクラの共有サーバーは2020/05時点でPythonが2.7です。
今回はPython3のWebサービスを動かす方法について紹介します。
【デモサイト】
https://needtec.sakura.ne.jp/yakusyopdf/
【コード】
https://github.com/mima3/yakusyopdf/tree/master/web
Python3のインストール
自分に権限のあるユーザディレクトリにPythonをソースからコンパイルしてインストールします。
今回の例では以下にインストールしました。
/home/ユーザ/local/bin/python3
2020/05時点ではPython3.8をサクラレンタルサーバーにビルドしてインストールする場合、以下のようなconfigureの実行後にmake installするだけでいいと思います。
./configure --prefix=$HOME/local/
※過去にはOpenSSLのバージョン違いのせいで、自前でOpenSSLもビルドする必要があったりした。
なお、過去に自前でPythonをインストールしていた場合は、自分でインストールした分は削除してから実行した方がいいです。
Webフレームワーク―Bottle
PythonのWebフレームワークは色々ありますが、今回のような環境ではBottleが最も楽です。
https://bottlepy.org/docs/dev/tutorial.html
Bottleの特徴として、bottle.pyという1ファイルをインポートするだけでルーティングの処理が記載できるようになります。
今回はbottleをcgiとして起動しています。
BottleをCGIとして起動するにはbottle.runを実行する際にパラメータにcgiを渡します。
from bottle import run
app = Bottle()
run(app, server='cgi')
サクラの共有サーバーでBottleを動かすには
さて、サクラの共有サーバーでBottleを動かすにはいくつかのコツがあります。
まず、cgiを動作させる際にpythonのパスを認識させる必要があります。
以下は実際のindex.cgiを抜粋したものです。
#!/home/needtec/local/bin/python3
# coding: utf-8
from bottle import run
# 略
一番先頭行にインストールしたpython3へのパスを記述します。
これにより、index.cgiを動作させる場合は、インストールしたpython3が動くようになります。
しかし、python3のパスだけを与えても動作はしません。
たとえば、pip3等でライブラリをインストールしていた場合などは、そのライブラリのパスもcgiが認識できるようにする必要があります。このためにはsys.pathにインポート対象のフォルダを追加する必要があります。
import sys
sys.path.append('/home/needtec/local/lib/python3.8/site-packages')
sys.path.append('/home/needtec/local/lib/python3.8/peewee-3.13.3-py3.8.egg-info')
また.htaccessを使用して「hoge/yakusyopdf/json/get_hospital」というリクエストを「hoge/yakusyopdf/index.cgi/json/get_hospital」に置き換えます。
.htaccess
RewriteEngine On
# Some hosts may require you to use the `RewriteBase` directive.
# If you need to use the `RewriteBase` directive, it should be the
# absolute physical path to the directory that contains this htaccess file.
#
# RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.cgi/$1 [L]
RewriteCondeでリクエストしたファイルが存在しない場合は、index.cgiを前に付与するようなルールになっています。
ここまでやることで、サクラの共有サーバーでPython3を使用したBottleのWebアプリケーションが実行できます。
開発環境も考慮する
先までで挙げた方法は実機だけで開発する分には問題ないですが、ローカルの環境でも動かすには辛いものがあります。
たとえば、index.cgiに記載するPythonのパスやsys.pathに追加するディレクトリは環境ごとにことなります。環境を変えるたびにそれらを修正するのは、辛いです。
そこで今回は、index.cgiを自動で作成するという手法をとっています。
index.original.cgiを元にapplication.iniとpythonのパスを元にcreate_index_cgi.pyを使用してindex.cgiを作成します。
#![python_path]
# coding: utf-8
from bottle import run
# import ConfigParser
import configparser #python3
import sys
conf = configparser.ConfigParser()
conf.read("[ini_path]")
try:
i = 0
path = conf.get('system', 'path' + str(i))
while path != "":
i = i + 1
sys.path.append(path)
path = conf.get('system', 'path' + str(i))
except configparser.NoOptionError as e:
pass
from application import app, setup
setup(conf)
run(app, server='cgi')
これを元に作成したindex.cgiは以下の通りです。
#!/home/needtec/local/bin/python3
# coding: utf-8
from bottle import run
# import ConfigParser
import configparser #python3
import sys
conf = configparser.ConfigParser()
conf.read("/home/needtec/work/yakusyopdf/application.ini")
try:
i = 0
path = conf.get('system', 'path' + str(i))
while path != "":
i = i + 1
sys.path.append(path)
path = conf.get('system', 'path' + str(i))
except configparser.NoOptionError as e:
pass
from application import app, setup
setup(conf)
run(app, server='cgi')
[python_path]と[ini_path]がそれぞれ、Pythonのパスとapplication.iniへのパスに変換されています。また、application.iniに記載されたパス情報を基に、sys.pathに追加を行い、インクルード対象のフォルダを追加します。
あとはindex.cgiには処理を記載しなければ様々な環境でデプロイしやすい構造となります。(※今回はメインの処理はapplication.pyに記載している)
まとめ
今回はサクラの共有サーバーでPython3のWebサービスを動かす方法について述べました。
現時点ではPython3は自前でビルドしてインストールする必要があります。
また、CGIからそれらを使用する場合にはインストールしたパスを適切に設定してあげる必要があります。