[ConoHa]PythonでメッセージボードのCGIを作ってみる

ConoHa

本記事では簡単なメッセージボードのCGIを作ってみます。
送信したメッセージをファイルに残して表示するようなシンプルなCGIです。

CGIを使えるようにする

Conoha WING上のサーバを前提に、まずはこちらの記事でCGIを使えるようにしておきます。

CGIファイル(testbbbs.cgi)作成

前回記事と同様に、infomisc.conohawing.comディレクトリ配下にtestbbs.cgiファイルを作成します。
本記事の場合は、http://infomisc.conohawing.com/testbbs.cgi でアクセスすることができるようになります。
URLについてはドメイン構成によっても変わりますので、ご確認をお願いします。

スクリプト全体

今回のスクリプト全体はこちらになります。

testbbs.cgi
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import datetime
import os
import urllib.parse

print("Content-Type: text/html")
print()
print('<html><body>')
print('<form action="testbbs.cgi" method="get">')
print('Message <input name="text_message" type="text"> <input name="send_message" type="submit" value="Send">')
print('</form><hr>')

if os.environ['QUERY_STRING'] != "":
    formd = urllib.parse.parse_qs(os.environ['QUERY_STRING'])
    if formd.get('send_message') != None:
        dt = datetime.datetime.now()
        dtstr = dt.strftime('%Y/%m/%d %H:%M:%S')
        f = open('textbbs_message', 'a')
        f.write('%s - %s\n' % (dtstr, formd["text_message"][0]))
        f.close()
    elif formd.get('del_message') != None:
        f = open('textbbs_message', 'w')
        f.write('')
        f.close()

lines = open('textbbs_message', 'r').readlines()
for l in reversed(lines):
    print('%s<hr>' % l)

print('<form action="testbbs.cgi" method="get"><input name="del_message" type="submit" value="All Delete"></form>')
print('</body></html>')

スクリプト解説

簡単にですがスクリプトを解説します。

解説
print("Content-Type: text/html")
print()
print('<html><body>')
print('<form action="testbbs.cgi" method="get">')
print('Message <input name="text_message" type="text"> <input name="send_message" type="submit" value="Send">')
print('</form><hr>')

メッセージを送信するためのフォームをHTML形式で出力しています。
詳細なHTMLタグの解説まではしませんが、ポイントとしてはaction属性で自身のスクリプトを指定していることと、送信methodとしてGETを指定しています。

解説
if os.environ['QUERY_STRING'] != "":
    formd = urllib.parse.parse_qs(os.environ['QUERY_STRING'])

送信methodがGETの場合、os.environ[‘QUERY_STRING’] に渡された値が格納されます。
値は「key1=value1&key2=value2」といった形式で渡されますので、urllib.parse.parse_qs関数を使って、ディクショナリ形式に変換しています。
このディクショナリ形式は、”key1″:[“value1”] といった形で、値は必ずリストで格納されます。

解説
    if formd.get('send_message') != None:
        dt = datetime.datetime.now()
        dtstr = dt.strftime('%Y/%m/%d %H:%M:%S')
        f = open('textbbs_message', 'a')
        f.write('%s - %s\n' % (dtstr, formd["text_message"][0]))
        f.close()

「Send」ボタンがクリックされた場合の処理です。
現在の日付と入力されたメッセージを、textbbs_messageファイルに追記で書き出します。

解説
    elif formd.get('del_message') != None:
        f = open('textbbs_message', 'w')
        f.write('')
        f.close()

「All Delete」ボタンがクリックされた場合の処理です。
textbbs_messageファイルに空文字を書き込んで初期化しています。

解説
lines = open('textbbs_message', 'r').readlines()
for l in reversed(lines):
    print('%s<hr>' % l)

textbbs_messageファイルを読み込んで、最新のメッセージである最後の行から順番に出力しています。

解説
print('<form action="testbbs.cgi" method="get"><input name="del_message" type="submit" value="All Delete"></form>')
print('</body></html>')

メッセージを全削除するためのフォームをHTML形式で出力しています。

その他の準備

ファイルの実行権限がないと実行できませんのでパーミッションを変更します。

$ chmod 755 testbbs.cgi
$ ls -l testbbs.cgi
-rwxr-xr-x 1 cXXXXXXX cXXXXXXX 1056 Apr 18 22:33 testbbs.cgi

事前にメッセージ保存用のファイルを作成しておきます。

$ touch textbbs_message

ここまででスクリプトの準備は完了です。

CGI実行

作成したCGIのURL(http://infomisc.conohawing.com/testbbs.cgi)にアクセスすると以下のように表示されます。

メッセージを入力すると、最新のメッセージが一番上に表示されるようにしています。
「All Delete」をクリックすると、これまでのメッセージをすべて削除することができます。

Internal Server Errorなどのエラーが表示された場合は、パスが間違っていないかや、ソースコードの貼り付けにミスがないかなどを確認してください。

補足:cgiモジュールが非推奨に

PythonでCGIプログラムを組む際にお世話になっていたcgiモジュールが非推奨になり、さらにバージョン3.13からはcgiモジュールそのものが存在しなくなっていますので、ご注意ください。

Python 3.12.2 (tags/v3.12.2:6abddd9, Feb  6 2024, 21:26:36) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cgi
<stdin>:1: DeprecationWarning: 'cgi' is deprecated and slated for removal in Python 3.13
Python 3.13.0 (tags/v3.13.0:60403a5, Oct  7 2024, 09:38:07) [MSC v.1941 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cgi
Traceback (most recent call last):
  File "<python-input-0>", line 1, in <module>
    import cgi
ModuleNotFoundError: No module named 'cgi'

本記事は、cgiモジュールの代替として、os.environを使ってCGIを作成してみました。

りお
りお

cgiモジュールを使わないでも実現できたので、このあたりは改めて勉強になりました。

まとめ

Conoha WINGのサーバを使ったCGI作成の第2弾として、フォームを利用したメッセージボードのCGIを作成してみました。
HTMLフォームでのデータのやり取りの仕方が分かると、色々応用が利きますので、CGI作成の足掛かりに少しでも参考になったら幸いです。

プログラミングスクールをまとめました。
Pythonなどのプログラミングを学ぶことで実現できることの幅が広がりますので、
参考にしていただければと思います。

コメント

タイトルとURLをコピーしました