Python HTTP 服务器发送 JSON 响应
Python HTTP server send JSON response
我在做什么
我试图用 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 部分。
如您所见,我正在发送 headers 和响应类型(成功登录为 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 表示"server error" 并且服务器在拒绝未经授权的用户时绝对没有错误! -) 使用 403 ("forbidden") 或其他与安全相关的 400 代码来拒绝未经授权的用户——有关更多信息,请参阅 http://en.wikipedia.org/wiki/HTTP_403 and more generally http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error。
后一点不是您要问的问题,但保持 HTTP 状态代码的语义完整性很重要——当今网络上经常违反它,这让 HTTP 客户端、服务器、代理的维护者很头疼、缓存等...让我们通过遵守标准让他们的生活更轻松,而不是更艰难!_)
我在做什么
我试图用 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 部分。
如您所见,我正在发送 headers 和响应类型(成功登录为 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 表示"server error" 并且服务器在拒绝未经授权的用户时绝对没有错误! -) 使用 403 ("forbidden") 或其他与安全相关的 400 代码来拒绝未经授权的用户——有关更多信息,请参阅 http://en.wikipedia.org/wiki/HTTP_403 and more generally http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error。
后一点不是您要问的问题,但保持 HTTP 状态代码的语义完整性很重要——当今网络上经常违反它,这让 HTTP 客户端、服务器、代理的维护者很头疼、缓存等...让我们通过遵守标准让他们的生活更轻松,而不是更艰难!_)