J'essaie de créer un simple serveur Python afin de tester mon frontend. Il devrait être capable de gérer les requêtes GET et POST. Les données doivent être toujours au format JSON jusqu'à ce qu'ils soient traduits en requête/réponse HTTP. Un script avec le nom correspondant doit être appelé pour gérer chaque requête.
server.py
#!/usr/bin/env python
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import SocketServer
import json
import urlparse
import subprocess
class S(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
def do_GET(self):
self._set_headers()
parsed_path = urlparse.urlparse(self.path)
request_id = parsed_path.path
response = subprocess.check_output(["python", request_id])
self.wfile.write(json.dumps(response))
def do_POST(self):
self._set_headers()
parsed_path = urlparse.urlparse(self.path)
request_id = parsed_path.path
response = subprocess.check_output(["python", request_id])
self.wfile.write(json.dumps(response))
def do_HEAD(self):
self._set_headers()
def run(server_class=HTTPServer, handler_class=S, port=8000):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print 'Starting httpd...'
httpd.serve_forever()
if __name__ == "__main__":
from sys import argv
if len(argv) == 2:
run(port=int(argv[1]))
else:
run()
Exemple de testscript.py
pour le traitement des requêtes, qui dans ce cas ne fait que renvoyer un objet JSON.
#!/usr/bin/env python
return {'4': 5, '6': 7}
Le serveur doit par exemple retourner {'4': 5, '6': 7}
pour une réponse au format http://www.domainname.com:8000/testscript .
Mon problème est que je ne peux pas comprendre comment passer des variables entre les deux et j'ai besoin d'aide pour le faire fonctionner.
J'utilise ceci:
https://Gist.github.com/earonesty/ab07b4c0fea2c226e75b3d538cc0dc55
from apiserve import ApiServer, ApiRoute
class MyServer(ApiServer):
@ApiRoute("/popup")
def addbar(req):
return {"boo":req["bar"]+1}
@ApiRoute("/baz")
def justret(req):
if req:
raise ApiError(501,"no data in for baz")
return {"obj":1}
MyServer("127.0.0.1",8000).serve_forever()
Ce wrapper particulier vous permet d'écouter facilement sur le port 0 (port haut aléatoire) que certains frameworks obscurcissent. Il gère automatiquement les demandes GET/POST pour toutes les routes et il fusionne dans les arguments URI avec les arguments d'objet JSON de niveau supérieur. Ce qui est assez bon pour moi dans la plupart des cas.
C'est un poids beaucoup plus léger que la plupart des frameworks. Les cas de test dans Gist montrent mieux comment cela fonctionne.