2012-03-08 41 views
6

Tôi đang sử dụng python -m SimpleHTTPServer để phân phát thư mục để thử nghiệm cục bộ trong trình duyệt web. Một số nội dung bao gồm các tệp dữ liệu lớn. Tôi muốn có thể gzip chúng và có SimpleHTTPServer phục vụ chúng với nội dung Mã hóa: gzip.Cách sử dụng Mã hóa nội dung: gzip với Python SimpleHTTPServer

Có cách nào dễ dàng để thực hiện việc này không?

Trả lời

4

Đây là một câu hỏi cũ, nhưng nó vẫn đứng thứ 1 trong Google đối với tôi, vì vậy tôi cho rằng câu trả lời thích hợp có thể được sử dụng cho người bên cạnh tôi.

Giải pháp hóa ra rất đơn giản. trong do_GET(), do_POST, vv, bạn chỉ cần thêm dòng sau:

content = self.gzipencode(strcontent) 
...your other headers, etc... 
self.send_header("Content-length", str(len(str(content)))) 
self.send_header("Content-Encoding", "gzip") 
self.end_headers() 
self.wfile.write(content) 
self.wfile.flush() 

strcontent là nội dung thực tế của bạn (như trong HTML, javascript hoặc nguồn HTML khác) và gzipencode:

def gzipencode(self, content): 
    import StringIO 
    import gzip 
    out = StringIO.StringIO() 
    f = gzip.GzipFile(fileobj=out, mode='w', compresslevel=5) 
    f.write(content) 
    f.close() 
    return out.getvalue() 
+0

Velis, làm bạn có mã chức năng hoàn chỉnh ở đâu đó? –

+0

Tất nhiên, ở trên là các bản sao chép thẳng của mã đó. Nhưng sau đó một lần nữa, các đoạn mã trên nói lên tất cả và mã hoạt động hoàn chỉnh cũng đóng vai trò như một cây cầu JSON, điều này sẽ làm mờ đi sự thuần túy của câu hỏi này. Dù sao, thả cho tôi một email nếu bạn cần thêm thông tin hoặc mã. – velis

+0

cảm ơn - chỉ cần bỏ một dòng. –

0

xây dựng trên @velis trả lời ở trên, đây là cách tôi làm điều đó. gZipping dữ liệu nhỏ không phải là giá trị thời gian và có thể tăng kích thước của nó. Thử nghiệm với khách hàng Dalvik.

def do_GET(self): 
    ... get content 
    self.send_response(returnCode)  # 200, 401, etc 
    ...your other headers, etc... 
    if len(content) > 100:      # don't bother compressing small data 
     if 'accept-encoding' in self.headers: # case insensitive 
      if 'gzip' in self.headers['accept-encoding']: 
       content = gzipencode(content) # gzipencode defined above in @velis answer 
       self.send_header('content-encoding', 'gzip') 
    self.send_header('content-length', len(content)) 
    self.end_headers()   # send a blank line 
    self.wfile.write(content) 
2

Như nhiều người khác, tôi cũng đã sử dụng python -m SimpleHTTPServer để thử nghiệm tại địa phương. Đây vẫn là kết quả hàng đầu trên google và trong khi https://github.com/ksmith97/GzipSimpleHTTPServer là một giải pháp tốt, nó thực thi gzip ngay cả khi không được yêu cầu và không có cờ để bật/tắt nó.

Tôi quyết định viết một công cụ cli nhỏ hỗ trợ điều này. Đó là đi, vì vậy các thủ tục thường xuyên cài đặt chỉ đơn giản là:

go get github.com/rhardih/serve

Nếu bạn đã có $GOPATH thêm vào $PATH, đó là tất cả bạn cần. Bây giờ bạn có serve làm lệnh.

https://github.com/rhardih/serve