PythonでRESTAPI的なプログラムを作った時のメモ。
あまりCGIで実行する人がいないようで、情報がそこまでありませんでしたが、Perlでやった経験もあり、動かせました。
環境
- Mac 10.13
- Python 3.6.0 (pyenv)
- Webサーバー apache2.4
- ルートディレクトリ /Library/WebServer/Documents/
- ルートディレクトリ直下にsampledir/python.pyというファイルをおく
- urlはhttp://localhost/sampledir/python.pyを想定
準備(主にapacheの設定)
1.cgiでpythonを動かせるようにするためにAdd-handlerに.pyを追加
1 |
AddHandler cgi-script .cgi .rb .pl .py |
2.実行するpython(URLとして叩くpythonのファイル)のパーミッションを775
実行するpythonの先頭行にシェバン(pythonのパス)を記述
1 |
#!/Users/ユーザー名/.pyenv/versions/3.6.0/bin/python |
*CentOSであれば/usr/bin/pyenvなどになるかと思います。
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/Users/ユーザー名/.pyenv/versions/3.6.0/bin/python #このモジュールがないと動きません。 import cgi import json #スタックトレースなど例外の情報が見やすくなります。 #ただしcontent-type text/htmlでないと機能しません。 import cgitb cgitb.enable() print('Content-Type:application/json;charset=utf-8\n\n') 何らかの処理 |
具体的なformのパラメータの取得などは下記リンクを参考に。
https://docs.python.jp/3/library/cgi.html
当初はCGI用のディレクトリ(/Library/WebServer/CGI-Executables/)でしか動かないと勘違いしていたので下記のような不要な行為をやってました。
何らかの時に役立つかもしれないので一応メモ。(DocumentsディレクトリにAddHandlerがあるので普通にcgiが動きます)
自分はDocumentsディレクトリにソースは置いておいて、CGI-ExecutablesディレクトリからDocumentsにシンボリックリンクを貼って動かそうとしました。
ちなみに間違っているわけではなく、localhost/cgi-bin/sampledir/python.pyを打てばもちろんこれでも動きます。
1 CGI用ディレクトリにアクセスした時にDocumentsをみるようにシンボリックリンクを貼る。
1 |
ln -s /Library/WebServer/Documents/sampledir /Library/WebServer/CGI-Executables/sampledir |
2 ちなみにディフォルトではシンボリックリンクが許可されていないのでOptions FollowSymlinksで許可をします。
1 2 3 4 5 6 |
<Directory "/Library/WebServer/CGI-Executables"> AllowOverride None Options None Options FollowSymlinks Require all granted </Directory> |