web-dev-qa-db-fra.com

Traitement du paramètre d'entrée HTTP GET côté serveur dans python

J'ai écrit un simple client et serveur HTTP en Python pour expérimenter. Le premier extrait de code ci-dessous montre comment j'envoie une demande HTTP GET avec un paramètre nommé imsi. Dans le deuxième extrait de code, je montre mon do_Get implémentation de la fonction côté serveur. Ma question est de savoir comment extraire le paramètre imsi dans le code serveur et renvoyer une réponse au client afin de signaler au client que imsi est valide.
Merci.

P.S .: J'ai vérifié que le client envoie la demande avec succès.

extrait de code CLIENT

    params = urllib.urlencode({'imsi': str(imsi)})
    conn = httplib.HTTPConnection(Host + ':' + str(port))
    #conn.set_debuglevel(1)
    conn.request("GET", "/index.htm", 'imsi=' + str(imsi))
    r = conn.getresponse()

extrait de code SERVER

import sys, string, cStringIO, cgi, time, datetime
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class MyHandler(BaseHTTPRequestHandler):

# I want to extract the imsi parameter here and send a success response to 
# back to the client.
def do_GET(self):
    try:
        if self.path.endswith(".html"):
            #self.path has /index.htm
            f = open(curdir + sep + self.path)
            self.send_response(200)
            self.send_header('Content-type','text/html')
            self.end_headers()
            self.wfile.write("<h1>Device Static Content</h1>")
            self.wfile.write(f.read())
            f.close()
            return
        if self.path.endswith(".esp"):   #our dynamic content
            self.send_response(200)
            self.send_header('Content-type','text/html')
            self.end_headers()
            self.wfile.write("<h1>Dynamic Dynamic Content</h1>")
            self.wfile.write("Today is the " + str(time.localtime()[7]))
            self.wfile.write(" day in the year " + str(time.localtime()[0]))
            return

        # The root
        self.send_response(200)
        self.send_header('Content-type','text/html')
        self.end_headers()

        lst = list(sys.argv[1])
        n = lst[len(lst) - 1]
        now = datetime.datetime.now()

        output = cStringIO.StringIO()
        output.write("<html><head>")
        output.write("<style type=\"text/css\">")
        output.write("h1 {color:blue;}")
        output.write("h2 {color:red;}")
        output.write("</style>")
        output.write("<h1>Device #" + n + " Root Content</h1>")
        output.write("<h2>Device Addr: " + sys.argv[1] + ":" + sys.argv[2] + "</h1>")
        output.write("<h2>Device Time: " + now.strftime("%Y-%m-%d %H:%M:%S") + "</h2>")
        output.write("</body>")
        output.write("</html>")

        self.wfile.write(output.getvalue())

        return

    except IOError:
        self.send_error(404,'File Not Found: %s' % self.path)
20
F. Aydemir

Vous pouvez analyser la requête d'une demande GET en utilisant urlparse, puis diviser la chaîne de requête.

from urlparse import urlparse
query = urlparse(self.path).query
query_components = dict(qc.split("=") for qc in query.split("&"))
imsi = query_components["imsi"]
# query_components = { "imsi" : "Hello" }

# Or use the parse_qs method
from urlparse import urlparse, parse_qs
query_components = parse_qs(urlparse(self.path).query)
imsi = query_components["imsi"] 
# query_components = { "imsi" : ["Hello"] }

Vous pouvez le confirmer en utilisant

 curl http://your.Host/?imsi=Hello
44
ib.lundgren

BaseHTTPServer est un serveur assez bas niveau. En général, vous voulez utiliser un véritable framework web qui fait ce genre de travail de grognement pour vous, mais puisque vous avez demandé ...

Importez d'abord une bibliothèque d'analyse d'url. Dans Python 2, x c'est rlparse . (Dans Python3, vous utiliseriez rllib.parse )

import urlparse

Ensuite, dans votre méthode do_get, analysez la chaîne de requête.

imsi = urlparse.parse_qs(urlparse.urlparse(self.path).query).get('imsi', None)
print imsi  # Prints None or the string value of imsi

De plus, vous pourriez utiliser rllib dans votre code client et ce serait probablement beaucoup plus facile.

14
Ken Kinder

Le module cgi contient la classe FieldStorage qui est censée être utilisée dans le contexte CGI, mais semble également être facilement utilisée dans votre contexte.

0
newtover