web-dev-qa-db-fra.com

Simple Python pour traiter les requêtes GET et POST avec JSON)

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.

9
Peter G.

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.

3
Erik Aronesty