Yêu cầu là tiêu chuẩn thực tế khi thực hiện các yêu cầu HTTP trong Python, đặc biệt là kể từ Python 3. Thư viện nguồn mở tóm tắt sự phức tạp của việc quản lý các kết nối mạng và giúp việc gửi các yêu cầu HTTP trở nên dễ dàng
Hầu hết các bạn có thể đã biết cách gửi HTTP POST, GET, cũng như các loại yêu cầu HTTP khác. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách đặt thời gian chờ trong requests
, cũng như quản lý các trường hợp ngoại lệ
Nội dung ẩn
1 Hết thời gian chờ trong yêu cầu Python
2 Bắt ngoại lệ hết thời gian chờ
3 Xử lý thời gian chờ nâng cao
4 Hết thời gian yêu cầu trong các coroutine không đồng bộ
Hết thời gian chờ trong yêu cầu Python
Bạn có thể yêu cầu thư viện requests
dừng chờ phản hồi sau một khoảng thời gian nhất định bằng cách chuyển một số đến tham số timeout
. Nếu thư viện requests
không nhận được phản hồi sau 11 giây, nó sẽ báo lỗi 12
Cách tốt nhất là mã sản xuất nên sử dụng tham số này trong tất cả các yêu cầu mạng. Không làm như vậy có thể khiến chương trình của bạn bị treo vô thời hạn. Nếu không có timeout
nào được chỉ định rõ ràng, các yêu cầu sẽ không hết thời gian chờ
Code language: PHP [php]
requests.get['//example.com/', timeout=10] # OUTPUT Traceback [most recent call last]: File "", line 1, in requests.exceptions.Timeout: HTTPConnectionPool[host='example.com', port=80]: Request timed out. [timeout=10]
Bắt ngoại lệ hết thời gian chờ
Khi giá trị thời gian chờ đã được đặt, mọi yêu cầu không nhận được phản hồi trong khung thời gian đã chỉ định sẽ gây ra lỗi
2. Điều quan trọng là phải xử lý ngoại lệ này, nếu không chương trình của bạn sẽ bị chấm dứtCode language: PHP [php]
import requests from requests.exceptions import Timeout try: requests.get['//www.example.com, timeout=10] except Timeout: print['Timeout has been raised.']
Để bắt lỗi
2 trongCode language: PHP [php]
import requests from requests.exceptions import Timeout try: requests.get['//www.example.com, timeout=10] except Timeout: print['Timeout has been raised.']
requests
, bạn phải tự nhập ngoại lệ bằng cách sử dụng 4Code language: PHP [php]
import requests from requests.exceptions import Timeout try: requests.get['//www.example.com, timeout=10] except Timeout: print['Timeout has been raised.']
Code language: PHP [php]
import requests from requests.exceptions import Timeout try: requests.get['//www.example.com, timeout=10] except Timeout: print['Timeout has been raised.']
Xử lý thời gian chờ nâng cao
Hầu hết các yêu cầu đến các máy chủ bên ngoài phải có thời gian chờ kèm theo, trong trường hợp máy chủ không phản hồi kịp thời. Theo mặc định, các yêu cầu không hết thời gian trừ khi giá trị thời gian chờ được đặt rõ ràng. Nếu không có thời gian chờ, mã của bạn có thể bị treo trong vài phút hoặc hơn
Thời gian chờ kết nối là số giây Yêu cầu sẽ đợi máy khách của bạn thiết lập kết nối với máy từ xa [tương ứng với lệnh gọi connect[]] trên ổ cắm. Đó là một cách tốt để đặt thời gian chờ kết nối lớn hơn một chút so với bội số của 3, đây là cửa sổ truyền lại gói TCP mặc định
Khi máy khách của bạn đã kết nối với máy chủ và gửi yêu cầu HTTP, thời gian chờ đọc là số giây mà máy khách sẽ đợi máy chủ gửi phản hồi. [Cụ thể, đó là số giây mà máy khách sẽ đợi giữa các byte được gửi từ máy chủ. Năm 99. 9% trường hợp, đây là thời gian trước khi máy chủ gửi byte đầu tiên]
Nếu bạn chỉ định một giá trị duy nhất cho thời gian chờ, như thế này
Code language: JavaScript [javascript]
r = requests.get['//github.com', timeout=5]
Giá trị thời gian chờ sẽ được áp dụng cho cả thời gian chờ của
5 vàCode language: PHP [php]
import requests from requests.exceptions import Timeout try: requests.get['//www.example.com, timeout=10] except Timeout: print['Timeout has been raised.']
6. Chỉ định một bộ nếu bạn muốn đặt các giá trị riêng biệtCode language: PHP [php]
import requests from requests.exceptions import Timeout try: requests.get['//www.example.com, timeout=10] except Timeout: print['Timeout has been raised.']
Code language: JavaScript [javascript]
r = requests.get['//github.com', timeout=[3.05, 27]]
Yêu cầu thời gian chờ trong quy trình không đồng bộ
Vì có rất nhiều người mới bắt đầu hỏi cách sử dụng requests
trong các chương trình hoặc coroutine không đồng bộ, nên chúng tôi đã tạo phần này dành riêng để trả lời câu hỏi đó.
requests
là một thư viện chặn, có nghĩa là nó không nên được sử dụng trong các coroutine không đồng bộ. Các thư viện thích hợp để sử dụng trong ngữ cảnh này là aiohttp và async-timeout. aiohttp là khung máy khách/máy chủ HTTP không đồng bộ, trong khi async-timeout là trình quản lý bối cảnh thời gian chờ tương thích với asyncio có thể được sử dụng để bọc bất kỳ coroutine nào bên trong trình quản lý bối cảnh “hết thời gian chờ”