質問するログイン新規登録
CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4752閲覧

pythonのcgiが動かずソースが表示される。

pyamathon

総合スコア14

CGI

CGI(Common Gateway Interface)とは、Webサーバー上でユーザプログラム動作させる仕組みのこと。また、動かす前提のプログラムをCGIと呼ぶこともあります。HTMLなどの静的な情報に限らず、プログラムの処理結果をベースにした動的情報の提供が可能です。

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/09/21 05:27

編集2021/09/30 04:27

0

0

前提・実現したいこと

ページで作成された配列をcsvへ書き込むためにpythonを使用したいです。

発生している問題・エラーメッセージ

その前にcgiの準備ができているか確認しようと公開されているソースを実行しましたが、
遷移後のページでソースが表示されてしまう。
(追記)ソースが表示されることはなくなったが500 Internal Server Errorが出る。

以下url
https://qiita.com/TSKY/items/b041de0572e6586c889c

該当のソースコード

html

1<!DOCTYPE html> 2<html> 3<head><meta charset="utf-8" /></head> 4<body bgcolor="lightyellow"> 5<h1>入力値の積を表示します</h1> 6 <form action="/cgi-bin/formtest1.py" method="POST"> 7 値1を入力してください 8 <input type="text" name="value1"> 9 値2を入力してください 10 <input type="text" name="value2"> 11 <input type="submit" name="submit" value="送信"> 12 </form> 13</body> 14</html>

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3import cgi 4form = cgi.FieldStorage() # cgiオブジェクト作成 5v1 = form.getfirst('value1') # nameがvalue1の値を取得 6v2 = form.getfirst('value2') # nameがvalue2の値を取得 7#入力値が数字ならその積を返す関数 8def times(a, b): 9 try: 10 a=int(a) 11 b=int(b) 12 return str(a*b) 13 except ValueError: 14 return('数値じゃないので計算できません(>_<)') 15 16# ブラウザに戻すHTMLのデータ 17print("Content-Type: text/html") 18print() 19htmlText = ''' 20<!DOCTYPE html> 21<html> 22 <head><meta charset="shift-jis" /></head> 23<body bgcolor="lightyellow"> 24 <h1>こんにちは</h1> 25 <p>入力値の積は&nbsp; %s<br/></p> 26 <hr/> 27 <a href="../form1.html">戻る</a>  28</body> 29</html> 30'''%(times(v1,v2)) # 入力値の積を%sの箇所に埋める 31print( htmlText.encode("cp932", 'ignore').decode('cp932') )

試したこと

正しく配置はしているのですが、サーバーにアップロードしている記事が少なくどうしていいかわからない状態です。

追記

拡張子を.py→.cgiに変更しました。
ご指摘いただいた
(#!/usr/bin/env python)

(#!/usr/local/bin/python)
に変更しました。
現在
.www
-form1.html
-formtest1.cgi
-.htaccess
が同じディレクトリに保存してあり、パーミッションも755に変更してありますが、
500 Internal Server Error が出ています。
エラーログは以下の通りです。

[Thu Sep 30 12:55:14.374649 2021] [cgi:error] [pid 99658] [client 118.***.185.***:0] AH01215: Traceback (most recent call last):: /home/***/www/formtest1.cgi, referer: https://***.ne.jp/form1.html [Thu Sep 30 12:55:14.374745 2021] [cgi:error] [pid 99658] [client 118.***.185.***:0] AH01215: File "formtest1.cgi", line 31, in <module>: /home/***/www/formtest1.cgi, referer: https://***.ne.jp/form1.html [Thu Sep 30 12:55:14.374799 2021] [cgi:error] [pid 99658] [client 118.***.185.***:0] AH01215: print( htmlText.encode("cp932", 'ignore').decode('cp932') ): /home/***/www/formtest1.cgi, referer: https://***.ne.jp/form1.html [Thu Sep 30 12:55:14.374899 2021] [cgi:error] [pid 99658] [client 118.***.185.***:0] AH01215: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 107: ordinal not in range(128): /home/***/www/formtest1.cgi, referer: https:/***.ne.jp/form1.html [Thu Sep 30 12:55:14.374924 2021] [cgi:error] [pid 99658] [client 118.***.185.***:0] malformed header from script 'formtest1.cgi': Bad header: (), referer: https://***.ne.jp/form1.html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/09/21 05:35

サーバは何ですか?(Apache? nginx?) その設定はどうなっていますか?
pyamathon

2021/09/21 06:14

ご返信ありがとうございます。 サーバーはさくらレンタルサーバーを利用しています。 cgiの利用に関して特に設定はしておりません。 よろしくお願いします。
guest

回答2

0

ベストアンサー

Pythonスクリプトファイルのパーミッションは正しく設定されているようなので、あとはそのPythonスクリプトファイルを置いたディレクトリの.htaccessファイル(無ければ作成してください)に下記の行を加えれば行けると思います。この設定ならスクリプトファイルのサフィックスは.cgiでも.pyでも大丈夫です。

AddType application/x-httpd-cgi cgi py

ただ、

Python

1#!/usr/bin/env python

これはエラーになりそうです。(たぶん 500 Internal Server Error)

Python

1#!/usr/local/bin/python

に変えれば大丈夫だと思います。

投稿2021/09/27 17:25

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pyamathon

2021/09/30 04:30

ご返信ありがとうございます。返信が遅くなり申し訳ありません。 ご指摘いただいたとおりに.htaccessファイルを作成しましたが500エラーが出ています。 ご助言いただければ幸いです。よろしくお願いいたします。
itagagaki

2021/09/30 04:40

スクリプトの実際の文字コードがUTF-8になっていないのでは
pyamathon

2021/09/30 05:10

ご返信ありがとうございます。 「実際の」というのはcgiの文字コードがutf-8になっていないということでしょうか。 また、どのように変更すればいいかご教示いただければ幸いです。 よろしくお願いいたします。
itagagaki

2021/09/30 05:48

ファイルの文字コードを設定・変更する方法がわからないですか? そのファイルはどうやって作成・編集したのですか?
pyamathon

2021/09/30 06:41

ご返信ありがとうございます。 visual studio code を使っているのですが、utf-8でコードを書いていることを確認しました。 またwith BOMでないことも確認しました。 何かほかに原因は考えられるのでしょうか。 ご返信いただければ幸いです。よろしくお願いします。
itagagaki

2021/09/30 06:57

htmlText.encode("cp932", 'ignore').decode('cp932') これはUTF-8の文字列 htmlText を、まず cp932 のバイト列に変換し、それを今度はまたUTF-8に変換しています。そこでUTF-8に変換するdecodeでエラーが生じています。 何の意図があるのかわかりませんが、 print( htmlText ) に直せばとりあえずエラーは回避できるのでは。
pyamathon

2021/10/04 08:15

ご返信遅くなりました。 解決いたしました。ご助言ありがとうございました。
guest

0

サーバーはさくらレンタルサーバーを利用しています。
cgiの利用に関して特に設定はしておりません。

さくらのレンタルサーバで、設定なしに動作する CGI の条件は、レンタルサーバサービス仕様CGI・PHP・SSI について に記載されていますが、指定されているディレクトリに CGI ファイルが保存されていて、ファイルの拡張子 ( .cgi ) や ファイルのパーミッションは 指定されたとおり正しいですか?

投稿2021/09/21 07:35

CHERRY

総合スコア25234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pyamathon

2021/09/21 11:48

ご返信ありがとうございます。 ご提示頂いたページを確認しました。 指定されているディレクトリに保存されていることを確認しました。パーミッションは755にしてあります。 参考にしたサイトでは.pyになっていたのですが、.cgiにする必要がありますか? また、こちらの認識違いなのかもしれませんが、ローカルファイルにpythonがある状態でcgiは動作するのでしょうか。 いろいろ聞いてしまって申し訳ありません。 ご返信お待ちしております。
CHERRY

2021/09/21 13:34 編集

> 参考にしたサイトでは.pyになっていたのですが、.cgiにする必要がありますか? さくらのレンタルサーバの標準設定の状態では、.py は、CGI として動きません。 .py にアクセスした場合は、ただのテキストファイルとして扱われます。 CGIとして動作させるには、拡張子を .cgi にする必要があります。 > また、こちらの認識違いなのかもしれませんが、ローカルファイルにpythonがある状態でcgiは動作するのでしょうか。 > 指定されているディレクトリに保存されていることを確認しました。 と書かれていますが、どのような状態になっているのでしょうか?
pyamathon

2021/09/30 04:29

ご返信ありがとうございます。返信が遅くなってしまい申し訳ございません。 cgiに変更させていただきました。 ソースが表示されることはなくなりましたが、500エラーが出てしまいます。 ディレクトリを追記させていただきました。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問