Python-HTTP-server senden, JSON-Antwort
Was ich tun
Ich versuche, um meine Hände schmutzig mit python und im machen ein sehr einfacher http-server, so kann ich das senden von Befehlen an meinen arduino über serial. Im überprüfen Sie die Befehle, wie ich sgould und alles funktioniert wie es ahould werden.
Das Konzept
Im mit dem HTTP-server in der Reihenfolge zu erhalten POST
Anfragen von remote-Computern und smartphones und ausführen von code mit meinem arduino über die Serielle.
Es hat einige Coole features wie Benutzer-und Benutzer-Berechtigungsstufen.
Das problem
Ich würde gerne feedback geben, wenn eine Anfrage kommt. Speziell JSON-feedback mit dem Ergebnis der Ausführung wie Fehler, Notizen und Erfolg.
Im denken, um ein Wörterbuch in python und fügen Sie, was ich will zurück zu senden, die das frontend dann enclode es in json und senden Sie es als eine Antwort. (So etwas wie der php - json_encode()
nimmt ein array und gibt json)
Den code
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()
Habe ich versucht zu minimieren, den code, so können Sie die klare "HTTP" - Teil.
Wie Sie sehen können im das senden der Header und der response-Typ (200 für eine erfolgreiche login-und 500, - für die erfolglosen login)
Ziele, die ich brauchen, um zu erreichen
-
Innen ein Wörterbuch, die Sachen, die ich verschlüsseln will,
- Beispiel: out = {'status': 'ok', 'ausgeführt': 'yes'}
- Antworten mit json
Den komplett code als gist: https://gist.github.com/FlevasGR/1170d2ea47d851bfe024
Ich weiß, das ist vielleicht nicht die beste Sie jemals seens in Ihrem Leben, aber seine meinem ersten Zeit mit dem schreiben in Python
🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
json
- Modul in der Python-standard-Bibliothek bietet genau die Funktionalität, die Sie für Fragen.import json
an der Spitze des Moduls und derjson.dumps(whatever)
um diejson
string zu senden, der in der Antwort.Als eine Randnotiz, andernfalls Autorisierung ist definitiv nicht ein 500-Fehler: 500 bedeutet "server-Fehler" und der server macht absolut keine Fehler in der Ablehnung nicht autorisierte Benutzer!-) Verwenden Sie ein 403 ("forbidden") oder andere sicherheitsrelevante 400-code ablehnen, nicht autorisierte Benutzer -- siehe http://en.wikipedia.org/wiki/HTTP_403 und generell http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error für mehr.
Letzteres bit ist nicht, was Sie Fragen, sondern die Aufrechterhaltung der semantischen Integrität der HTTP-status-codes ist wichtig-es verletzt oft genug auf dem Netz heute zu geben Kopfschmerzen an die Betreuer von HTTP-clients, - Servern, proxies, caches, &c... let ' s make Ihr Leben leichter, nicht schwerer, indem Sie sich an die standards!_)
self.wfile
nach der end_headers nennen.self.wfile.write(result)
nach derend_headers
call-viel, viel besser als messing mit den tatsächlichen Dateien auf Datenträgern. Diese sind "Datei-like objects" (die andere istself.rfile
um den Körper der Anfrage) und es ist besser, lassen Sie die Python-standard-Bibliothek die Arbeit für Sie tun. BTW, heute WSGI ist die empfohlene Weg, um Python-HTTP-Server -- siehe docs.python.org/2/library/wsgiref.html#module-wsgiref und im ersten Beispiel insbesondere.