[Python] Apache cgiでPythonを使う方法


Devlopment note / Python    作成日付 : 2020/07/09 19:58:19   修正日付 : 2020/07/09 19:58:19

こんにちは。明月です。


この投稿はApache cgiでPythonを使う方法に関する説明です。


以前に私がPythonを利用してウェブサーバー(http.server)を構築する方法に関して説明したことがあります。

link - [Python] Web serverを起動する方法(http.server)


でも、私も実際にhttp.serverを利用してウェブサーバーを構築したことはありません。実はhttp.serverでサービスを構築すると思えばちゃんと運用するかの疑問もあるし、良いAPIやオープンソースも多いのでPython(http.server)で構築する必要性を感じられません。

ウェブAPIプラットフォームをPHPに決め、構築する場合にapacheで構築します。 PHP言語も個人的に素晴らしいウェブスクリプト言語だし、よく使うプログラム言語です。

でも、ウェブの流れは様々のユーザが接続するマルチスレッド環境ですが、スクリプト言語のPHP言語だけでコントロールが限界があるし様々なCのDLLを参照して使うことはオブジェクトポイントやリソースを扱うことも簡単ではありません。

その限界はApacheのcgiでpythonを運用してある程度に補完がされます。私の場合、特にPythonは統計やグラフなどのライブラリがすごく多いのでよく使います。なので、PHPの言語の限界を超えてプログラミングを実装する場合はありません。


apacheにphpを設定する方法は以前に説明したことがあるのでご参考をお願します。

link - [PHP] PHP 開発環境設定とEclipse(IDE)の設定


apacheのcgiではperlとpythonを使うことがあります。perlも良いプログラム言語ですが、少し古い言語だし、コミュニティも以前より小さくなったので、最近はよく使わないかと思いもあります。(perl開発者にはすみません。)

そうならapacheのhttpd.confでcgiを設定しなければならないです。

***
<Directory "${SRVROOT}/cgi-bin">
  AllowOverride none
  AddHandler cgi-script .cgi .pl .py
  Options +ExecCGI
  Require all granted
</Directory>
***


apacheは基本的にcgiがperlで設定されているのでpythonを追加します。

(参考にapacheが実行するpcにはpythonがインストールしなければならないです。)


そしてapacheフォルダに行ったらcgi-binフォルダにあるのでそこにindex.pyを作成します。


#!D:\anaconda3\python.exe	
# 最上端はpythonがインストールされているパスだ。
# -*- coding: UTF-8 -*-
# ファイルのエンコードタイプだ。
import cgi
# cgiはcgiプログラムに使うモジュールだ。
import cgitb
# cgitbはcgiプログラムデバッグに関するモジュールだ。(エラーが発生すればphpみたいにエラーを画面に表示する。)
cgitb.enable()

# パラメータを取得するための関数
# get、post区分なしでデータを持ち込む。
form = cgi.FieldStorage()
# パラメータdataを取得する。
data = form.getvalue('data')
# パラメータのtestを取得する。
test = form.getvalue('test')
# 画面い応答するhtmlドキュメント
html = f"""	
<!DOCTYPE html>	
<html>	
  <head><title>python</title></head>	
  <body>	
    <form method='post'>	
      <input type='text' name='test' value='hello'>	
      <input type='submit'>	
    </form>	
    <br />	
    data - {data} <br />	
    test - {test} <br />	
  </body>	
</html>	
""";	
# ヘッダータイプ設定
print("Content-type:text/html")	
# httpプロトコールでheaderとbodyの区分は改行なので必ず入れる。なければエラーに発生する。(bodyがないhttpファイルなので)
print('')
# バーディーを出力
print(html)


上の例をみれば私がパラメータでdataとtestの値を出力することにしました。はじめはGET方式で接続すればtestはNoneで出力しますが、テキストボックスにデータを入れてsubmitボタンを押下すると表示されます。

参考 - https://www.tutorialspoint.com/python/python_cgi_programming.htm


os.environを通ってヘッダーの情報を得られます。その中でヘッダー情報によってクッキーを取得できます。

#!D:\anaconda3\python.exe	
# 最上端はpythonがインストールされているパスだ。
# -*- coding: UTF-8 -*-	
# ファイルのエンコードタイプだ。
import cgi
# cgiはcgiプログラムに使うモジュールだ。
import cgitb
# cgitbはcgiプログラムデバッグに関するモジュールだ。(エラーが発生すればphpみたいにエラーを画面に表示する。)
cgitb.enable()
# os.environを使うためのモジュールだ。
import os
# ヘッダー設定
print("Content-type:text/html")
# httpプロトコールでheaderとbodyの区分は改行なので必ず入れる。なければエラーに発生する。(bodyがないhttpファイルなので)
print('')
# バーディーを出力
print("<html><head><title>python</title></head><body>")
# 情報を出力する。
for param in os.environ.keys():
  print ("<b>%20s</b>: %s<br />" % (param, os.environ[param]))
print("</body></html>");


サーバ情報や要請ヘッダー情報が表示されます。


ここまでApache cgiでPythonを使う方法に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿