2012-02-22 33 views
5

Używam skryptu python do robienia mojego serwera WWW przy użyciu modułu BaseHTTPServer. Poniżej jest kod dla serwera:Uzyskiwanie adresu IP z żądania HTTP POST przy użyciu Pythona

import string,cgi,time 
from os import curdir, sep 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
#import pri 

class MyHandler(BaseHTTPRequestHandler): 

    def do_GET(self): 
     try: 
     if self.path.endswith("/"): 
     f = open(curdir + sep + "index.html") 
     self.send_response(200) 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 
     self.wfile.write("<HTML> GET OK.<BR>") 
     f.close() 
     return 

      return 

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


    def do_POST(self): 
     global rootnode 
     try: 
      ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) 
      if ctype == 'multipart/form-data': 
       query=cgi.parse_multipart(self.rfile, pdict) 
      self.send_response(200) 
      self.send_header('Content-type', 'text/html') 
     self.end_headers() 
     file = query.get('file') 
     self.wfile.write("<HTML> POST OK.<BR>") 
     f = open("data.zip", "wb") 
      f.write(file[0]) 
      f.close() 
      print("File received.") 
     return 

     except : 
      pass 

def main(): 
    try: 
     server = HTTPServer(('', 8080), MyHandler) 
     print 'started httpserver...' 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print '^C received, shutting down server' 
     server.socket.close() 

if __name__ == '__main__': 
    main() 

Czy mimo to aby uzyskać adres IP żądania POST kiedy mój serwer odbiera go? Z góry bardzo dziękuję.

Odpowiedz

5

Powinieneś być w stanie uzyskać ich adres IP z self.client_address[0].

+0

Kiedy zrobić 'print self.client_address', to daje mi adres IP i numer. Czy to numer portu? – androidnoob

+0

@ androidnoob: Tak, druga liczba to port klienta. Jeśli chcesz tylko adres IP, dodaj "[0]" na końcu. – icktoofay

+0

Rozumiem. Dziękuję bardzo za szybką odpowiedź! Nie mogę ci wystarczająco podziękować! – androidnoob

0

Dla tych, którzy nie stosując bibliotekę BaseHTTPServer self.request.remote_addr działa dobrze

+0

To nie zadziała poprawnie, jeśli Python będzie proksował za pomocą niektórych usług internetowych, ponieważ IP będzie wskazywać na proxy, więc nagłówek powinien być przekierowany, taki jak 'X-Forwarded-For' – moka

Powiązane problemy