Python HTTP服务器发送JSON响应

时间:2015-01-30 16:36:38

标签: python json http http-headers

我在做什么

我试图让我的手弄脏python和我制作一个非常简单的http服务器,所以我可以通过串口发送命令到我的arduino。我可以像我一样验证命令,一切都可以正常运行。

概念

我使用HTTP服务器来接收来自远程计算机和智能手机的POST请求,并使用我的arduino通过Serial执行代码。 它没有很少的酷功能,如用户和用户权限级别。

问题

我想在请求到达时提供反馈。具体的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表示登录失败)

我需要完成的目标

complet代码作为要点:https://gist.github.com/FlevasGR/1170d2ea47d851bfe024

我知道这可能不是你生命中最好的,但这是我第一次用Python写作:)

1 个答案:

答案 0 :(得分:9)

Python标准库的json模块提供了您正在要求的功能。模块顶部的import jsonjson.dumps(whatever),以便在回复中发送json字符串。

作为旁注,失败的授权绝对是 500错误:500意味着"服务器错误"并且服务器在拒绝未经授权的用户时绝对没有错误! - )使用403("禁止")或其他与安全相关的400代码来拒绝未经授权的用户 - 请参阅http://en.wikipedia.org/wiki/HTTP_403等一般http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error以获取更多信息。

后一点并不是你要问的问题,但维护HTTP状态代码的语义完整性非常重要 - 它在今天的网络上经常遭到违反,令管理员感到头疼。 HTTP客户端,服务器,代理,缓存,并且......通过坚持标准,让他们的生活变得更轻松,而不是更难!_)