2015-10-11 14 views
11

Tôi muốn đăng nhập tổng số byte tải về và tải lên bởi kịch bản Python của tôi.Các yêu cầu Python/urllib - Giám sát băng thông sử dụng

total_downloaded_bytes = 0 
def bandwidth_hook(r, *args, **kwargs): 
    global total_downloaded_bytes 
    total_downloaded_bytes += len(r.content) 
req = requests.session() 
req.hooks = {'response': bandwidth_hook} 

Đoạn mã trên không tính đến nén HTTP (nếu tôi đúng) và kích thước của tiêu đề.

Có cách nào để đếm tổng số được tải lên và tải về byte từ một requests.session? Nếu không, số lượng kịch bản là bao nhiêu?

Trả lời

4

Bạn có thể truy cập đối tượng r.request để tính byte gửi đi và bạn có thể xác định byte đến (được nén hoặc không) bằng cách xem tiêu đề content-length cho yêu cầu đến. Điều này đủ cho 99% của tất cả các yêu cầu mà bạn thường làm.

Tính toán kích thước byte tiêu đề rất dễ dàng đủ; chỉ cần thêm khóa và giá trị dài, thêm 4 byte cho dấu hai chấm và khoảng trống, cộng thêm 2 byte cho dòng trống:

def header_size(headers): 
    return sum(len(key) + len(value) + 4 for key, value in headers.items()) + 2 

Ngoài ra còn có dòng ban đầu; đó là {method} {path_url} HTTP/1.1{CRLF} cho các yêu cầu và HTTP/1.x {status_code} {reason}{CRLF} cho phản hồi. Những độ dài đó đều có sẵn cho bạn.

Tổng kích thước sau đó là:

request_line_size = len(r.request.method) + len(r.request.path_url) + 12 
request_size = request_line_size + header_size(r.request.headers) + int(r.request.headers.get('content-length', 0)) 
response_line_size = len(r.response.reason) + 15 
response_size = response_line_size + header_size(r.headers) + int(r.headers.get('content-length', 0)) 
total_size = request_size + response_size 
+0

Wow, trông cách phức tạp cho một cái gì đó đơn giản. Cảm ơn câu trả lời! – Elmo

+1

@Elmo: đối tượng respone là mô hình cấp cao về thông tin HTTP và không bao giờ là trường hợp sử dụng để xây dựng lại hoàn toàn các byte giao thức HTTP bên dưới. –

+0

Bạn không thể móc ở đâu đó sâu hơn? Dòng tcp thực sự hoặc ở đâu đó? – Elmo

Các vấn đề liên quan