Python

スターサーバーでPython CGIを使う

  • Pocket

掲題のとおり、スターサーバーでPython CGIを使う機会がありました。

情報の少ないところもありましたので、使ったコード等も残しておきます。

Pythonの場所

これはサーバー管理ツール>サーバー情報>コマンドパス情報と進めば確認できます。

Pythonの3系は3.6が「/usr/bin/python3.6」にありますね。

一部の最新機能に対応していないことはありますが、f文字列はギリギリ使えます。

ファイルをつくる

ここではPOSTで送信された文字列を取得して、そのまま同じ文字列を繰り返して返すだけの単純なスクリプトを想定します。

#!/usr/bin/python3.6
# -*- coding: utf-8 -*-

import sys
import io
 
# 各種初期設定
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
print("Content-Type: text/html;charset=utf-8\n\n")

data = sys.stdin.read()
print(f"{data}{data}")

ここで注意が必要なのがUTF-8+LFで保存する必要があることです。

Windowsで作業しているとCR+LFで保存されてしまいがちなので、最終的にWeb上のファイルマネージャーで変更してしまってもいいかもしれません。

最初にshebangを記入し、次に標準入出力の設定やレスポンスヘッダーの書き込みを行います。

sys.stdin.read()で標準入力を取得したら、そのまま二つ重ねて返すだけの簡単なファイルができました。

アクセス設定をする

ファイルをアップロードしたら、ファイルマネージャーで実行権限を与えてやります。

「操作」の歯車アイコンをクリックすると設定ウィンドウが開くので、「オーナー」と「その他」の実行にチェックを入れ(705)、変更ボタンをクリックします。

.cgiファイルならこのままでいいらしいのですが、.pyの場合は.htaccessでcgiとして実行できるようにしておく必要があります。同じディレクトリに.htaccessをつくったら、以下の内容を書き込みます。

AddHandler cgi-script .py

これで準備は完了です。

CGIを呼び出す

このcgiを呼び出すだけの、超簡単なページを同じディレクトリにつくります。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset='utf-8'>
    <meta http-equiv='X-UA-Compatible'>
    <title>Page Title</title>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <script src="/main.js"></script>
</head>
<body>
    <button onclick="test()">test</button>
</body>
</html>
function test() {
  fetch("./test.py", {
    method: "POST",
    body: "test"
  })
    .then(res => {
      res.text()
        .then(text => {
          console.log(text)
        })
    })
}

これで無事完了です。

  • Pocket