17
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Máy chủ của tôi thực hiện các yêu cầu bên ngoài và tôi muốn hạn chế thiệt hại mà một yêu cầu không thể thực hiện được. Tôi đang tìm cách hủy bỏ yêu cầu trong những tình huống này:
- Tổng thời gian của yêu cầu vượt quá một giới hạn nhất định [ngay cả khi dữ liệu vẫn đến]
- Tổng kích thước nhận được vượt quá giới hạn [tôi cần hủy trước khi chấp nhận thêm dữ liệu]
- Tốc độ truyền giảm xuống dưới một số cấp độ [mặc dù tôi có thể sống mà không có mức này nếu có thể cung cấp tổng thời gian giới hạn]
Lưu ý rằng tôi không tìm kiếm tham số timeout
trong các yêu cầu, vì đây chỉ là thời gian chờ không hoạt động. Tôi không thể tìm thấy bất cứ điều gì để làm với tổng thời gian chờ hoặc một cách để hạn chế tổng kích thước. Một ví dụ cho thấy tham số maxsize
trên HTTPAdapter
nhưng điều đó không được ghi lại.
Làm thế nào tôi có thể đạt được các yêu cầu này bằng cách sử dụng requests
?
Đã hỏi ngày 12 tháng 3 năm 2014 lúc 8:45Mar 12, 2014 at 8:45
eda-qa mort-ora-yeda-qa mort-or-yedA-qa mort-ora-y
29K38 Huy hiệu vàng132 Huy hiệu bạc252 Huy hiệu Đồng38 gold badges132 silver badges252 bronze badges
4
Bạn có thể thử cài đặt stream=True
, sau đó hủy bỏ yêu cầu khi vượt quá giới hạn thời gian hoặc kích thước của bạn trong khi bạn đọc dữ liệu trong các đoạn.
Kể từ bản phát hành requests
2.3.0, thời gian chờ cũng áp dụng cho các yêu cầu phát trực tuyến, vì vậy tất cả những gì bạn cần làm là cho phép hết thời gian chờ cho kết nối ban đầu và từng bước lặp:
r = requests.get[..., stream=True, timeout=initial_timeout]
r.raise_for_status[]
if int[r.headers.get['Content-Length']] > your_maximum:
raise ValueError['response too large']
size = 0
start = time.time[]
for chunk in r.iter_content[1024]:
if time.time[] - start > receive_timeout:
raise ValueError['timeout reached']
size += len[chunk]
if size > your_maximum:
raise ValueError['response too large']
# do something with chunk
Điều chỉnh thời gian chờ khi cần thiết.
Đối với các bản phát hành requests
10000: # you can decide your chunk size limit[page_size]
response_content.append[chunk]
response.close[]
break
else:
response_content.append[chunk] # has full page source
break
2; Một máy chủ ngừng phản hồi ở giữa một khối vẫn sẽ buộc kết nối. Bạn sẽ phải bọc mã trên trong một hàm hết thời gian chờ để cắt bỏ các phản hồi dài hạn sớm.
Đã trả lời ngày 12 tháng 3 năm 2014 lúc 9:46Mar 12, 2014 at 9:46
Martijn Pieters ♦ Martijn Pieters♦Martijn Pieters
990K276 Huy hiệu vàng3898 Huy hiệu bạc3249 Huy hiệu đồng276 gold badges3898 silver badges3249 bronze badges
4
Nó hoạt động cho tôi
import requests
response = requests.get[your_url, stream=True, timeout=10]
response_content = [] #contains partial or full page_source
for chunk in response.iter_content[1024]:
if len[chunk]>10000: # you can decide your chunk size limit[page_size]
response_content.append[chunk]
response.close[]
break
else:
response_content.append[chunk] # has full page source
break
Đã trả lời ngày 7 tháng 4 năm 2021 lúc 13:06Apr 7, 2021 at 13:06
Yêu cầu Python là một thư viện tuyệt vời để thực hiện các yêu cầu HTTP. Nó tự động xử lý nén và chuyển hướng. Thư viện này cũng có một luồng tùy chọn mạnh mẽ, cực kỳ hữu ích để làm việc với các tệp lớn. Một tệp nén lớn có thể được phát trực tuyến, được giải nén khi bay, xử lý và tái tạo cùng một lúc, mà không tải xuống toàn bộ tệp. Sau đây là đoạn mã, được lấy từ StackOverflow, biểu thị cách chúng ta có thể sử dụng giới hạn kích thước và thời gian chờ với thư viện yêu cầu.r = requests.get[..., stream=True, timeout=initial_timeout]
r.raise_for_status[]
if int[r.headers.get['Content-Length']] > your_maximum:
raise ValueError['response too large']
size = 0
start = time.time[]
for chunk in r.iter_content[1024]:
if time.time[] - start > receive_timeout:
raise ValueError['timeout reached']
size += len[chunk]
if size > your_maximum:
raise ValueError['response too large']
# do something with chunk
Howerver, có một nhược điểm của phương pháp này, nội dung won được giải mã theo mặc định. Kiểm tra các ý kiến về câu trả lời cụ thể này.
Do đó, nếu chúng ta muốn giới hạn, kích thước phản hồi và chúng ta có thể đi theo cách tiếp cận này.
import requests r = requests.get['//github.com/timeline.json', timeout=5, stream=True] content = r.raw.read[100000+1, decode_content=True] if len[content] > 100000: raise ValueError['Too large a response'] print content print json.loads[content]
Với cách tiếp cận này, chúng ta có thể giới hạn, kích thước phản hồi. Tuy nhiên, trước khi cố gắng nhận được phản hồi, chúng tôi có thể kiểm tra các tiêu đề trước tiên, ví dụ:
if 'html' not in r.headers.get['Content-Type']: raise ValueError['Not Html Document']
Theo cách này, thay vì tạo yêu cầu đầu trước, sau đó thực hiện yêu cầu nhận, chúng tôi có thể thực hiện một yêu cầu nhận và kiểm tra các tiêu đề trước, sau đó nhận nội dung nếu đáp ứng các yêu cầu của chúng tôi.