我在做什么
我试图用 python 弄脏我的手,我正在制作一个非常简单的 http 服务器,这样我就可以通过串行向我的 arduino 发送命令。我正在按照我应该的方式验证命令,一切正常。
概念
我正在使用 HTTP 服务器接收来自远程计算机和智能手机的 POST
请求,并通过 Serial 使用我的 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 部分。
如您所见,我发送了 header 和响应类型(成功登录为 200,登录失败为 500)
我需要完成的目标
将我要编码的内容传入字典
- 示例:out = {'status': 'ok', 'executed': 'yes'}
- 响应json
作为要点的完整代码:https://gist.github.com/FlevasGR/1170d2ea47d851bfe024
我知道这可能不是你一生中见过的最好的,但这是我第一次用 Python
编写 :)
最佳答案
Python 标准库的 json
模块提供了您所要求的功能。 import json
在你的模块的顶部和 json.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 客户端、服务器、代理、缓存的维护者头疼, &c...让我们坚持标准,让他们的生活更轻松,而不是更艰难!_)
关于Python HTTP 服务器发送 JSON 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28240464/