2012-02-22 7 views
5

Tôi đang sử dụng tập lệnh python để làm máy chủ web của mình bằng mô-đun BaseHTTPServer. Dưới đây là mã của tôi cho máy chủ:Nhận địa chỉ IP từ yêu cầu HTTP POST bằng cách sử dụng Python

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

Có cách nào để nhận địa chỉ IP của yêu cầu POST khi máy chủ của tôi nhận được yêu cầu đó không? Rất cám ơn trước.

Trả lời

5

Bạn sẽ có thể nhận địa chỉ IP của mình với self.client_address[0].

+0

Khi tôi làm 'in self.client_address', nó mang lại cho tôi một địa chỉ IP và một số. Đó có phải là số cổng không? – androidnoob

+0

@androidnoob: Có, số thứ hai là cổng của khách hàng. Nếu bạn chỉ muốn địa chỉ IP, hãy kết thúc '[0]'. – icktoofay

+0

Tôi hiểu. Cảm ơn bạn rất nhiều vì câu trả lời nhanh chóng của bạn! Tôi không thể cảm ơn bạn đủ cho nó! – androidnoob

0

Đối với những người không sử dụng thư viện BaseHTTPServer self.request.remote_addr làm việc tốt

+0

Điều đó sẽ không hoạt động đúng nếu python proxied sử dụng một số dịch vụ web, vì IP sẽ trỏ đến proxy để tiêu đề phải được chuyển tiếp như 'X-Forwarded-For' – moka