Non sono sicuro di come viene generato il reindirizzamento ... Ho provato a implementare un SimpleHTTPServer di base e non ho alcun reindirizzamento quando utilizzo parametri di stringa di query.
Basta fare qualcosa come self.path.split("/")
ed elaborare il percorso prima di gestire la richiesta? Questo codice fa quello che vuoi penso:
import SocketServer
import SimpleHTTPServer
import os
class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def folder(self):
fid = self.uri[-1].split("?id=")[-1].rstrip()
return "FOLDER ID: %s" % fid
def get_static_content(self):
# set default root to cwd
root = os.getcwd()
# look up routes and set root directory accordingly
for pattern, rootdir in ROUTES:
if path.startswith(pattern):
# found match!
path = path[len(pattern):] # consume path up to pattern len
root = rootdir
break
# normalize path and prepend root directory
path = path.split('?',1)[0]
path = path.split('#',1)[0]
path = posixpath.normpath(urllib.unquote(path))
words = path.split('/')
words = filter(None, words)
path = root
for word in words:
drive, word = os.path.splitdrive(word)
head, word = os.path.split(word)
if word in (os.curdir, os.pardir):
continue
path = os.path.join(path, word)
return path
def do_GET(self):
path = self.path
self.uri = path.split("/")[1:]
actions = {
"folder": self.folder,
}
resource = self.uri[0]
if not resource:
return self.get_static_content()
action = actions.get(resource)
if action:
print "action from looking up '%s' is:" % resource, action
return self.wfile.write(action())
SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
class MyTCPServer(SocketServer.ThreadingTCPServer):
allow_reuse_address = True
httpd = MyTCPServer(('localhost', 8080), CustomHandler)
httpd.allow_reuse_address = True
print "serving at port", 8080
httpd.serve_forever()
Provalo:
HTTP GET /folder/?id=500x
->"FOLDER ID: 500x"
EDIT:
Va bene così se non avete usato la SimpleHTTserver-roba prima, in pratica implementate il gestore di richieste di base, implementate do_GET(), do_PUT(), do_POST() ecc.
Quello che faccio di solito è analizzare la stringa di richiesta (usando re), la corrispondenza di modello e vedere se riesco a trovare un gestore di richieste e, in caso contrario, gestire la richiesta come richiesta di contenuto statico se possibile.
Tu dici che vuoi per servire contenuti statici, se possibile, allora si dovrebbe capovolgere questo pattern matching in giro, e vedere prima se la richiesta corrisponde al file-store e se non, quindi partita contro i gestori :)
SimpleHTTPServer serve solo file. Usa qualcos'altro per gestire i parametri nelle richieste. –