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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

2700閲覧

cgi(python3)で出力する際によくあるおまじない『print("Content-type:~』の意味と必要性に関して

Akihiro_py

総合スコア55

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

2クリップ

投稿2020/09/23 00:43

編集2020/09/23 02:07

前提・実現したいこと

プログラム初心者で、python3とJavaScriptを独習しているものです。
いまjQueryのajaxを使ってJSONデータの送受信の勉強をしています。
プログラムとしては、ブラウザに表示されたボタンを押すと、ブラウザのコンソールにメッセージが表示されるというものです。

※今回のプログラムの構成

  • pythonの簡易サーバ/Apacheサーバ
  • ┣index.html(jQuery)
  • ┗cgi-bin
  • ┗sample.py

試行錯誤の結果、JSONの通信は出来ました。
ただ、cgi(python3)側の送信内容に疑問があります。

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

cgi(python3)の参考資料を見ると、データ送信時によく以下の出力をすべきとの指示があります。

print("Content-type: application/json")←おまじないだが今回はこれが原因で通信できなかった print("\n\n") ←おまじないだが今回はこれが原因で通信できなかった print(json_data) ←送信したい内容 print('\n') ←おまじないだが今回はこれが原因で通信できなかった

ただ今回は、このおまじないが原因で通信ができませんでした。

そこで質問なのですが、このおまじないの意味はなんでしょうか?
現在はもう不要で良いのでしょうか?

<以下、追記しています>
具体的には以下の状況となります。

今回のプログラムですが、通信ができないとChrome-デベロッパーツール-Conslole-messageに『失敗』の表示がされます。
おなじないが無いと、メッセージ内容『python is good!!』がきちんとChromeのコンソールに表示されます。

ですので、以下の状態になるにもかかわらず、多くの資料でおまじないを付ける理由を知りたいと思っています。
・おまじないが無いとJavaScript側でdata.resultに『OKが格納される』
・おまじないが有るとJavaScript側にdata.resultに『OKが格納されない』

<追記終わり>

※念のため、Apacheでも実行しましたが同様の結果でした。

該当のソースコード

python3

1start.py 2#簡易サーバで起動 3from http.server import HTTPServer, CGIHTTPRequestHandler 4 5class Handler(CGIHTTPRequestHandler): 6 cgi_directories = ["/cgi-bin"] 7 8PORT = 8080 9httpd = HTTPServer(("", PORT), Handler) 10httpd.serve_forever()

html

1index.html 2<!DOCTYPE html> 3<html lang="ja" dir="ltr"> 4<head> 5 <meta charset="utf-8"> 6 <title>jQueryのテスト</title> 7 <script src="https://code.jquery.com/jquery-3.5.1.min.js" charset="utf-8"></script> 8 <script> 9 jQuery(function ($) { 10 //開始行 11 $("#sample").on("click", function(){ 12 $.ajax({ 13 url:"cgi-bin/sample.py", 14 type:"post", 15 dataType:"json", 16 data:{ 17 "myname":"yamada", 18 "mypass":"abcde", 19 "myclss":"level2" 20 }, 21 success:function(data){ 22 if(data.result==="OK"){ 23 console.log(data.message); 24 }else{ 25 console.log("失敗"); 26 } 27 } 28 }); 29 }); 30 //終了行 31 }); 32 </script> 33</head> 34<body> 35 <form> 36 <input type="button" id="sample" value="サンプル"> 37 </form> 38</body> 39</html>

python3

1sample.py 2import json 3import os 4# 不要なインポートは省略 5 6def main(): 7 # おまじない 8 print("Content-type: text/html; charset=UTF-8") 9 print("\r\n\r\n") 10 11 # POSTデータの判定 12 if (os.environ['REQUEST_METHOD'] != "POST"): 13 print("METHOD不正") 14 15 # データ取得、取り出す処理(省略) 16 17 dict = {"result": "OK", "message": "python is good!!"} 18 json_data = json.dumps(dict) 19 20 # 不要なおまじない 21 # print("Content-type: application/json") 22 # print("\n\n") 23 print(json_data) 24 # print('\n') 25 26 27if __name__ == "__main__": 28 29 main()

補足情報

Python 3.6.8
Google Chrome(最新)
Windows 10

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

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

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

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

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

m.ts10806

2020/09/23 00:45

>このおまじないが原因で通信ができませんでした。 何が起きたんでしょうか。
Akihiro_py

2020/09/23 00:57

ことば足らずで申し訳ありません。 今回のプログラムですが、通信ができないとChrome-デベロッパーツール-Conslole-messageに『失敗』の表示がされます。 おなじないが無いと、メッセージ内容『python is good!!』がきちんとChromeのコンソールに表示されます。 ですので、以下の状態になるにもかかわらず、多くの資料でおまじないを付ける理由を知りたいと思っています。 ・おまじないが無いとJavaScript側でdata.resultに『OKが格納される』 ・おまじないが有るとJavaScript側にdata.resultに『OKが格納されない』
m.ts10806

2020/09/23 01:01

質問本文に追記してください。
Akihiro_py

2020/09/23 02:08

了解しました。 質問本文に追記しています。
guest

回答2

0

CGI(Common Gateway Interface)については、RFC3875 - IETF で仕様が規定されています。(実際はRFCなので、「皆さん、実装の際はこの文書の記載内容に準拠させしましょう。」と言うスタンスですが)

この内、Content-Lengthヘッダーフィールドについては、スクリプトがセットしなければならない。と明記されています。

6.2.1. Document Response

The CGI script can return a document to the user in a document
response, with an optional error code indicating the success status
of the response.

document-response = Content-Type [ Status ] *other-field NL response-body

The script MUST return a Content-Type header field. A Status header
field is optional, and status 200 'OK' is assumed if it is omitted.
The server MUST make any appropriate modifications to the script's
output to ensure that the response to the client complies with the
response protocol version.

従って、WEBサーバーがCGIスクリプトを実行するときにそのCGIスクリプトがContent-Typeヘッダーフィールドをセットするのは、必須の動作仕様と言うことができます。HTTPレスポンスのコンテントボディに入るデータの内容はそのCGIスクリプトが理解しているのだから、担当として妥当とも言えます。「おまじない」以上のものです。これは、Python、Ruby、Perl、C言語等、プログラミング言語を問わず、CGIの実行プログラムとして動作するときはそのようにしなければいけません。

投稿2020/09/23 02:24

dodox86

総合スコア9183

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

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

Akihiro_py

2020/09/23 04:02

解説、大変ありがとうございます。 cgiを勉強するにあたり、この部分は基礎知識になると理解しました。 なかなか理解が難しそうですが、頑張ってみます。 今回は質問して、本当に良かったです。
guest

0

ベストアンサー

Content-typeの行はHTTPのレスポンスヘッダで、真っ先に出力する必要があります。CGIの場合、空行を2つ挟んでからがレスポンスボディです。

JSONを出力したい場合は、最初にContent-type: application/jsonを出力する必要があります。書かれたコードの場合、最初のContent-type: text/html; charset=UTF-8の方でヘッダが終わっているため、正しくありません

投稿2020/09/23 00:46

maisumakun

総合スコア145183

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

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

maisumakun

2020/09/23 00:51 編集

上にあるContent-type:をapplication/jsonに書き換えてください。直前で改めてContent-type:を出力するのは適当ではありません。
Akihiro_py

2020/09/23 01:29

回答ありがとうございます。 大変勉強になりました。 以下のように変更したところ、ChromeのResponseの表示もJSONを認識したと思われる形で表示されました。 print("Content-type: application/json; charset=UTF-8") print("\r\n\r\n") HTTPのレスポンスヘッダですね。 全く気にしていなかった分野なので、これから勉強しようと思います。
Akihiro_py

2020/09/23 22:36 編集

ベストアンサーですが、先に回答して頂いたmaisumakunさんにさせて頂きます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問