2012-10-18 17 views
13

lubię używać Pythona SimpleHTTPServer dla lokalnego rozwoju wszelkiego rodzaju aplikacji internetowych, które wymagają zasobów ładowanie poprzez Ajax wzywa itpDlaczego SimpleHTTPServer przekierowuje do? Querystring/kiedy żądam? Querystring?

Kiedy używać ciągi zapytań w moich adresów URL, serwer zawsze przekierowuje do tego samego adresu URL z ukośnikiem dołączone.

Na przykład /folder/?id=1 przekierowuje do /folder/?id=1/ przy użyciu odpowiedzi HTTP 301.

Po prostu uruchamiam serwer, używając python -m SimpleHTTPServer.

Masz pomysł, jak pozbyć się przekierowania? To jest Python 2.7.2.

+0

SimpleHTTPServer służy tylko do plików. Użyj czegoś innego, aby poradzić sobie z parametrami w żądaniach. –

Odpowiedz

3

OK. Z pomocą Mortena wymyśliłem to, co wydaje mi się wszystkim, czego potrzebuję: po prostu ignoruj ​​ciągi zapytań, jeśli tam są i obsługuj pliki statyczne.

import SimpleHTTPServer 
import SocketServer 

PORT = 8000 


class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): 

    def __init__(self, req, client_addr, server): 
     SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, req, client_addr, server) 

    def do_GET(self): 
     # cut off a query string 
     if '?' in self.path: 
      self.path = self.path.split('?')[0] 
     SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) 


class MyTCPServer(SocketServer.ThreadingTCPServer): 
    allow_reuse_address = True 

if __name__ == '__main__': 
    httpd = MyTCPServer(('localhost', PORT), CustomHandler) 
    httpd.allow_reuse_address = True 
    print "Serving at port", PORT 
    httpd.serve_forever() 
+0

To wydaje się nie respektować parametrów adresu URL. Nadal dołącza znak "/" po zapytaniach. –

2

Nie jestem pewien, w jaki sposób generowane jest przekierowanie ... Próbowałem wdrożyć bardzo prosty SimpleHTTPServer, i nie otrzymuję żadnych przekierowań podczas korzystania z parametrów ciągów zapytania.

Po prostu zrób coś takiego, jak self.path.split("/") i przetwórz ścieżkę przed obsługą żądania? Ten kod robi to, co chcesz, myślę:

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() 

Wypróbuj:

HTTP GET /folder/?id=500x ->"FOLDER ID: 500x"

EDIT:

Dobrze więc, jeśli nie stosuje się SimpleHTTPServer-stuff wcześniej, w zasadzie implementujesz podstawowy program obsługi żądań, implementujesz do_GET(), do_PUT(), do_POST() itp.

To, co zwykle robię, to analizowanie łańcucha żądania (za pomocą re), dopasowywania wzorców i sprawdzanie, czy mogę znaleźć requestera obsługi, a jeśli nie, obsłużyć żądanie jako żądanie statycznej treści, jeśli to możliwe.

Mówisz, że chcesz służyć zawartości statycznej, jeśli to w ogóle możliwe, to należy odwrócić ten wzorzec dopasowanie wokół, i po raz pierwszy zobaczyć, czy wniosek jest zgodny z pliku-sklepie, a jeśli nie, to meczu z obsługą :)

+0

Po pierwsze, dziękuję! Pokazuje, że można zapobiec przekierowaniu.Wygląda jednak na to, że ten moduł obsługi nie obsługuje statycznych plików, tak jak jestem przyzwyczajony. Zasadniczo chcę mieć możliwość obsługi dowolnej ścieżki, która jest dostępna jako plik statyczny, całkowicie ignorując część ciągu zapytania. – Marian

+0

Po prostu dodaj logikę w metodzie do_GET(), zrobiłem aktualizację, która robi właśnie to –

+0

czy rozważałeś użycie web.py? jest naprawdę lekki i stanowi ułamek powyższego kodu. –

3

Prawo sposobem na to, zrobić, aby upewnić się, że parametry zapytań pozostanie tak, jak powinny, jest upewnienie się zrobić wniosek do pliku bezpośrednio, zamiast pozwolić SimpleHTTPServer przekierować do index.html

Dla przykład http://localhost:8000/?param1=1 wykonuje przekierowanie (301) i zmienia adres URL na http://localhost:8000/?param=1/, co jest związane z parametrem zapytania.

Jednak http://localhost:8000/index.html?param1=1 (co jawnie plik indeksu) ładuje się poprawnie.

Po prostu nie pozwól, aby SimpleHTTPServer przekierowanie adresu URL rozwiązało problem.