Batas waktu dapat dengan mudah ditambahkan ke URL yang Anda minta. Kebetulan, Anda menggunakan URL pihak ketiga dan menunggu tanggapan. Itu selalu merupakan praktik yang baik untuk memberikan batas waktu pada URL, karena kami mungkin ingin URL merespons dalam rentang waktu dengan tanggapan atau kesalahan. Tidak melakukannya, dapat menyebabkan menunggu permintaan itu tanpa batas waktu
Kami dapat memberikan batas waktu ke URL dengan menggunakan param batas waktu dan nilai diteruskan dalam hitungan detik seperti yang ditunjukkan pada contoh di bawah ini –
Contoh
import requests getdata = requests.get('//jsonplaceholder.typicode.com/users',timeout=0.001) print(getdata.text)Keluaran
raise ConnectTimeout(e, request=request) requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='jsonplaceholder.typicode.com', port=443): Max retries exceeded with url: /users (Caused by Connect TimeoutError(, 'Connection to jsonplaceholder.typicode.com timed out. (connect timeout = 0.001)')) _Batas waktu yang diberikan adalah sebagai berikut −
getdata = requests.get('//jsonplaceholder.typicode.com/users',timeout=0.001)Eksekusi melempar kesalahan batas waktu koneksi seperti yang ditunjukkan pada output. Batas waktu yang diberikan adalah 0. 001, yang tidak memungkinkan permintaan untuk mendapatkan kembali respons dan melontarkan kesalahan. Sekarang, kami akan menambah batas waktu dan memeriksa
ReadTimeout_ terjadi ketika situs web yang Anda coba sambungkan tidak mengirim kembali data tepat waktu. Anda dapat mensimulasikan kesalahan ini untuk situs web dengan menggunakan waktu tunggu baca khusus dalam panggilan request.get() Anda
import requests # Timeout is in seconds connect_timeout = 5 read_timeout = 0.1 response = requests.get("//scrapingbee.com/", timeout=(connect_timeout, read_timeout))
Jika Anda yakin IP Anda tidak diblokir oleh situs web dan situs web hanya membutuhkan lebih banyak waktu sebelum mengembalikan data, maka Anda dapat memperbaiki kesalahan ini dengan menambah batas waktu baca
Permintaan adalah standar de-facto ketika membuat permintaan HTTP dengan Python, terutama sejak Python 3. Pustaka sumber terbuka mengabstraksi kompleksitas pengelolaan koneksi jaringan dan membuat pengiriman permintaan HTTP menjadi mudah
Sebagian besar dari Anda mungkin sudah mengetahui cara mengirim HTTP POST, GET, serta jenis permintaan HTTP lainnya. Dalam artikel ini, kami akan memandu Anda tentang cara menyetel waktu tunggu di requests, serta mengelola pengecualian
Isi
Batas waktu dalam permintaan Python
Anda dapat memberi tahu perpustakaan requests untuk berhenti menunggu respons setelah jangka waktu tertentu dengan meneruskan nomor ke parameter timeout. Jika perpustakaan requests_ tidak menerima respons dalam x detik, itu akan menimbulkan kesalahan Timeout
Merupakan praktik terbaik bahwa kode produksi harus menggunakan parameter ini di semua permintaan jaringan. Kegagalan untuk melakukannya dapat menyebabkan program Anda macet tanpa batas. Jika tidak ada timeout yang ditentukan secara eksplisit, waktu permintaan tidak akan habis
requests.get('//example.com/', timeout=10) # OUTPUT Traceback (most recent call last): File "<stdin>", line 1, in <module> requests.exceptions.Timeout: HTTPConnectionPool(host='example.com', port=80): Request timed out. (timeout=10)
Code language: PHP (php)_Tangkap pengecualian batas waktu
Setelah nilai batas waktu ditetapkan, setiap permintaan yang tidak menerima tanggapan dalam jangka waktu yang ditentukan akan menimbulkan kesalahan Timeout. Penting untuk menangani pengecualian ini, jika tidak, program Anda akan dihentikan
Untuk menangkap Timeout kesalahan di requests, Anda harus mengimpor pengecualian itu sendiri menggunakan
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)4import 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)Penanganan batas waktu lanjutan
Sebagian besar permintaan ke server eksternal harus memiliki batas waktu terlampir, seandainya server tidak merespons secara tepat waktu. Secara default, permintaan tidak habis waktu kecuali nilai batas waktu ditetapkan secara eksplisit. Tanpa batas waktu, kode Anda mungkin macet selama beberapa menit atau lebih
Batas waktu koneksi adalah jumlah detik Permintaan akan menunggu klien Anda membuat koneksi ke mesin jarak jauh (sesuai dengan panggilan connect()) pada soket. Ini adalah praktik yang baik untuk mengatur batas waktu koneksi menjadi sedikit lebih besar dari kelipatan 3, yang merupakan jendela pengiriman ulang paket TCP default
Setelah klien Anda terhubung ke server dan mengirim permintaan HTTP, batas waktu baca adalah jumlah detik klien akan menunggu server mengirim respons. (Khususnya, ini adalah jumlah detik klien akan menunggu di antara byte yang dikirim dari server. Di 99. 9% kasus, ini adalah waktu sebelum server mengirimkan byte pertama)
Jika Anda menentukan satu nilai untuk batas waktu, seperti ini
r = requests.get('//github.com', timeout=5)
Code language: JavaScript (javascript)Nilai batas waktu akan diterapkan pada batas waktu
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)5 danimport 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)6. Tentukan tuple jika Anda ingin mengatur nilainya secara terpisahr = requests.get('//github.com', timeout=(3.05, 27))
Code language: JavaScript (javascript)Minta batas waktu dalam coroutine async
Karena ada banyak pemula yang menanyakan cara menggunakan requests dalam program asinkron atau coroutine, kami membuat bagian ini khusus untuk menjawab hal itu
requests adalah perpustakaan pemblokiran, yang artinya tidak boleh digunakan dalam coroutine asinkron. Pustaka yang tepat untuk digunakan dalam konteks ini adalah aiohttp dan async-timeout. aiohttp adalah kerangka kerja klien/server HTTP asinkron, sedangkan async-timeout adalah pengelola konteks batas waktu yang kompatibel dengan asyncio yang dapat digunakan untuk membungkus coroutine apa pun di dalam pengelola konteks "batas waktu"