【问题标题】:Python HTTP server send JSON responsePython HTTP 服务器发送 JSON 响应
【发布时间】:2015-01-30 16:36:38
【问题描述】:

我在做什么

我试图用 python 弄脏我的手,并且我制作了一个非常简单的 http 服务器,这样我就可以通过串行向我的 arduino 发送命令。我正在验证命令,一切正常。

概念

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

问题

我想在请求到达时提供反馈。特别是带有执行结果的 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 上写信:)

【问题讨论】:

    标签: python json http http-headers


    【解决方案1】:

    Python 标准库的json 模块提供了您所要求的功能。 import json 位于模块顶部,json.dumps(whatever) 获取要在响应中发送的 json 字符串。

    附带说明,授权失败绝对是不是 500 错误:500 表示“服务器错误”,服务器在拒绝未经授权的用户时绝对没有错误!-) 使用 403 ( "forbidden") 或其他与安全相关的 400 代码来拒绝未经授权的用户 - 请参阅 http://en.wikipedia.org/wiki/HTTP_403 和更一般的 http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error 了解更多信息。

    后一点不是您要问的,但维护 HTTP 状态代码的语义完整性很重要——如今它在网络上经常被违反,让 HTTP 客户端、服务器、代理、缓存的维护者头疼, &c... 让我们通过遵守标准让他们的生活更轻松,而不是更艰难!_)

    【讨论】:

    • 您好亚历克斯,感谢您的回复。确实它的完美!正是我想要的,但是您对如何将其推回给用户有任何线索吗?
    • @ZisakisZavitsanakis, SimpleHTTPRequestHandler 旨在“提供当前目录及以下目录中的文件”,docs.python.org/2/library/simplehttpserver.html。尽管如此,你仍然继承了它并覆盖了方法,所以你使用的本质上是docs.python.org/2/library/basehttpserver.html——因此你可以在 end_headers 调用之后写给self.wfile
    • 嗯,所以基本上我需要推送文件而不是字符串。如果我将编码的字典写入临时文件并推送它怎么办?然后在每个请求上覆盖它
    • @ZisakisZavitsanakis,只是在end_headers 调用之后的self.wfile.write(result) -- 比处理实际的磁盘文件要好得多。这些是“类文件对象”(另一个是self.rfile 来获取请求的主体),最好让 Python 的标准库为您完成工作。顺便说一句,现在 WSGI 是制作 Python HTTP 服务器的推荐方式——请参阅docs.python.org/2/library/wsgiref.html#module-wsgiref,尤其是第一个示例。
    • 我做到了,它几乎成功了,但我不仅得到了 json 响应,而且得到了这样的 html:{"lights2": 2, "lights1": 2, "tv1": 4, " tv2": 4}HTTP/1.0 200 OK 服务器:SimpleHTTP/0.6 Python/2.7.8 日期:2015 年 1 月 30 日星期五 17:10:46 GMT 内容类型:文本/html; charset=mbcs Content-Length: 318 目录列表为/

      目录/


    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多