質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

89.63%

post通信でpython.cgiとの連携に関して

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 445

gyungyun545

score 81

状況

現在、javascriptとpythonで簡単なアンケートサイトを立ち上げ中です。
クライアントサイドはほぼでき、後は、クライアントからjsonでデータをpostし、サーバーはそれを保存して、ランダムな文字列を返却する処理を実装すれば完成です。
(ランダム文字列は後々にアンケートに回答した証拠として使う)

環境

<サーバー>
Python : 3.6.7
OS     : CentOS Linux release 7.6.1810 (Core)
Apache :
| Server version: Apache/2.4.6 (CentOS)
| Server built:   Nov  5 2018 01:47:09

<クライアント>
ブラウザ: Chrome バージョン: 73.0.3683.103
OS     : windows10

困っていること

サーバーからクライアントにデータを返す処理でつまずいてます。
特に悩んでいるのは、python3の文法的に正しい処理を追加してもサーバー側でエラーになり原因がわからないでおります。

問題の処理は下記cgiですが「#この処理を消すと動く。」の部分をコメントアウトすると問題なく動き、クライアント側で「hello!」と表示されます。しかし、このままだとサーバーエラーになります。
この行はpython3.6では問題なく実行できるので、原因が全く理解できず。
※ その上、修正前のソースコードではこの行も問題なく動いてました。なんどか修正中にできなくなってしまったので余計どこがどう作用しているのかわからないでおります。

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
import json
import cgi
import cgitb
import sys
import random, string
cgitb.enable()

print('Content-type: text/html; charset=UTF-8\r\n')
print('hello!')

#この処理を消すと動く。
print(''.join(random.choices(string.ascii_letters + string.digits, k=8)))
#この処理を消すと動く。

data   = sys.stdin.read()
params = json.loads(data)

with open("A.txt", mode="w") as f:
    json.dump(params, f)

exit()


下記にクライアント側のソースを簡潔に再現しました。

class A {
    constructor() {
        data = []
        data.append(new B(x1,y1));
        data.append(new B(x2,y2));
        :
    }
    :
    submit() {// クラス配列"data"をJSONに変換して、サーバーにPOST
        var json = JSON.stringify(this.data);
        $.post("A.py", json, function(result) {alert(result);});
    }
}
var a;
$(function() {
    a = new A();
    $("#submit").click(function() { //ボタンクリック時に関数submit実行
        a.submit();
    };
});

試したこと

「#この処理を消すと動く。」の部分を消して実行すると、クライアント側では「hello!」とアラートが表示され、サーバー側では、dataのJSONデータがファイル「A.txt」に吐き出されます。
また、「#この処理を消すと動く。」の部分をサーバーのpython3.6に対話形式で実行すると正常に実行され、ランダムな文字列が表示されます。

どうしたいか

とにかく、ランダムな文字列をクライアント側に渡せること。また生成したランダム文字列をjsonに混ぜてファイル出力ができれば、実現方法はこだわりません。サーバー側はpythonにもこだわりません。
ご教授いただけますと幸いです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

カッコ())が一つ足りないですよ

print(''.join(random.choices(string.ascii_letters + string.digits, k=8))

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/16 17:23

    ご回答有り難うございます。
    しょうもないミスでした。
    サーバー側の処理だと気が付きに行くみたいです。

    キャンセル

  • 2019/04/16 17:33

    apacheの設定にもよりますが、CGIの標準エラー出力(この場合はpython3のスクリプトの例外)はエラーログが出力されるので、サーバーエラーの場合は見てみるといいです。/var/log/httpd/error_log 等

    キャンセル

  • 2019/04/17 08:44

    ご丁寧にありがとうございます。
    ログありました。次トラブルが起きたときは確認してみます。

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる