web-dev-qa-db-ja.com

Python HTTPサーバーはJSON応答を送信します

私は何をしています

pythonで手を汚そうとしていますが、非常に単純なhttpサーバーを作成しているので、シリアル経由でarduinoにコマンドを送信できます。コマンドをsgouldとして検証し、すべてが正常に機能します。あります。

コンセプト

リモートサーバーやスマートフォンからPOSTリクエストを受け取り、シリアル経由でarduinoでコードを実行するためにHTTPサーバーを使用していますユーザーやユーザー権限レベルなどの優れた機能はほとんどありません。

問題

リクエストが届いたらフィードバックを送りたいと思います。具体的には、エラー、メモ、成功などの実行結果を含むJSONフィードバック。 pythonでディクショナリを作成し、フロントエンドに送り返したいものをすべて追加してから、それをjsonに含めて、応答として送信します。(phpのjson_encode()のようなもの配列を取り、jsonを出力します)

コード

import SimpleHTTPServer
import SocketServer
import logging
import cgi
import time
import sys

class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):

def do_GET(self):
    logging.warning("======= GET STARTED =======")
    logging.warning(self.headers)
    SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)

def do_POST(self):
    form = cgi.FieldStorage(
        fp=self.rfile,
        headers=self.headers,
        environ={'REQUEST_METHOD':'POST',
                 'CONTENT_TYPE':self.headers['Content-Type'],
                 })

    if self.check_auth(username, passcode):
        self.send_response(200)
        self.send_header('Content-Type', 'application/json')
        self.end_headers()
    else:
        print cur_time + "failed to login " + form.list[0].name + form.list[0].value
        self.send_response(500)
        self.send_header('Content-Type', 'application/json')
        self.end_headers()

SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
Handler = ServerHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.serve_forever()

明確なHTTP部分が表示されるように、コードを最小化しようとしました。

ご覧のとおり、ヘッダーと応答タイプを送信しています(ログインが成功した場合は200、ログインが失敗した場合は500)

私が達成する必要がある目的

要旨としての完全なコード: https://Gist.github.com/FlevasGR/1170d2ea47d851bfe024

これはあなたが今まで見た中で最高ではないかもしれませんが、Pythonで書くのは初めてです:)

11

Pythonの標準ライブラリのjsonモジュールは、まさにあなたが求めている機能を提供します。モジュールの上部にある_import json_とjson.dumps(whatever)を使用して、応答で送信するjson文字列を取得します。

ちなみに、認証の失敗は間違いなくnot500エラーです:500は「サーバーエラー」を意味し、サーバーは不正を拒否する際にエラーをまったく発生させませんユーザー!-)403(「禁止」)またはその他のセキュリティ関連の400コードを使用して、許可されていないユーザーを拒否します http://en.wikipedia.org/wiki/HTTP_4 およびより一般的には http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error 詳細。

この後者のビットはあなたが求めているものではありませんが、HTTPステータスコードのセマンティックの整合性を維持することは重要です-今日のWebでは、HTTPクライアント、サーバー、プロキシ、キャッシュなどのメンテナに頭痛を与えるほど頻繁に違反しています。 ..標準に固執することで、難しくなく、彼らの生活をより簡単にしましょう!_)

9
Alex Martelli