Python プログラミング

Python3でCGIを実行。失敗しやすいポイントも紹介。

投稿日:2018年7月18日 更新日:

こんにちは!シミダイ(@shimidai2100)です。

Pythonで「CGI(Common Gateway Interface)」を使用する方法を紹介します。

初めてCGIを使う人向けに分かりやすく説明しておりますので、

この機会にPythonがWebサーバ上でどのように動作するのか理解しましょう。

Pythonには強力なWeb開発フレームワークとして、

  • Djando
  • Flask
  • Bottle

があります。

基本となるCGIの動作を学ぶことで上記のフレームワークをより理解し使いこなすことが出来ます。


CGI実行環境

今回使用する実行環境は下になります。

  • CentOS 7(KAGOYA VPS)
  • Webサーバ:Apache
  • Python:Version 3.6.5

作成するファイルと配置先

今回のディレクリ構成は以下になります。

-/cgi-bin

└ pyCGI.py

- /html

└ index.html

Apacheをインストールした時のデフォルト設定になります。

以下、Apacheインストール方法です。

LinuxにApacheをインストールする方法

こんにちは!シミダイ(@shimidai2100)です。 Apecheをインストールする手順について紹介します。 Contents1 インストール環境2 インストール手順3  Apacheの自動起動設 ...

続きを見る

HTMLのフロントページ

今回使用するHTMLのフロントページ「index.html」は以下になります。

formタグを使い、「POST」で入力値をCGIに渡します。

PythonのCGIコード

「index.html」から渡された入力値を受け取る「pyCGI.py」は以下になります。

1行目の「#!/usr/bin/python」で実行するPythonのパスを設定します。

環境ごとに違うので「which python」で確認しましょう。

3行目の「import cgi」でcgiライブラリをインポートします。

9行目の「Content-Type: text/html; charset=UTF-8\n」はCGIを使う上でのおまじないなので、どのCGIにも記載します。

22,23行目でPOSTされた値を処理して、text変数に格納しています。

CGIファイルに実行権限を付与

pyCGI.py」をサーバに配置したら実行権限を付けましょう。

以下実行ログです。

[root@localhost cgi-bin]# chmod 755 pyCGI.py
[root@localhost cgi-bin]# ls -l
total 4
-rwxr-xr-x. 1 root root 497 Jul 17 20:40 pyCGI.py

実行権限を付与しない場合、以下の500エラーとなるでの注意してください。

Pythonファイルに実行権限がないと500エラーが発生する画面

エラーログには「Permission denied: exec of '/xxx/xxx/www/cgi-bin/pyCGI.py'」と出力されます。

PythonのCGIを実行してみる

「index.html」を格納したURLにアクセスしてみましょう。

表示されたら下のように「Test」と入力してみましょう。

PythonのCGIの動作確認

下のように入力した文字列が表示されたら正常に動作しています。

PythonのCGIで正常に入力した値を表示

マルチバイト文字列(日本語)がCGIで動作しない場合の対処方法

マルチバイト文字列を「POST」した時に正常に動作しない環境が存在します。

エラーログを確認しますと「UnicodeEncodeError: 'ascii' codec can't encode characters in position 」が表示されています。

これはCGIの実行ユーザの環境変数に「LANG」が設定されていないため発生します。

この問題の対象方法は、明示的にPythonが出力する文字列を「UTF-8」にすれば解決します。

4,5行目で「sys」と「io」ライブラリをインポートします。

8行目で標準出力の文字コードを「UTF-8」で出力するように設定することで、

マルチバイト文字列も正常に出力することができます。

下にように表示されれば正常に動作しています。

PythonのCGIでマルチバイト文字列を正常に処理する例

 

スポンサードリンク

関連記事

-Python, プログラミング

Translate »

Copyright© shimidai2100 , 2018 All Rights Reserved.