In questo articolo vedremo come verificare la connettività di un sito remoto usando il modulo Python requests.
Dopo aver attivato il nostro virtual environment, installiamo il modulo requests
come segue:
pip install requests
Per il nostro scopo, dobbiamo effettuare una richiesta HTTP di tipo HEAD
e verificare che il codice di stato HTTP sia uguale a 200. Vogliamo usare esclusivamente il protocollo HTTPS e accettare il fatto che un sito possa avere dei redirect HTTP di tipo 3xx che non ne pregiudicano la connettività.
Come timeout alla connessione useremo un valore pari a 3 secondi. Potrebbero verificarsi delle eccezioni: usando il metodo raise_for_status()
del modulo requests, facciamo in modo che venga sollevata un'eccezione di tipo HTTPError
se il codice di stato della risposta è di tipo 4xx o 5xx. Un'altra eccezione che potrebbe verificarsi è ad esempio quella relativa ad una query DNS fallita, per cui useremo l'eccezione ConnectionError
.
Possiamo racchiudere questa logica nella seguente funzione:
import requests
def get_url(url=None):
if url is None:
raise ValueError('URL is required')
if not url.startswith('https://'):
return False, 'HTTPS only'
try:
response = requests.head(url, timeout=3, allow_redirects=True)
response.raise_for_status()
return True, response.status_code
except requests.exceptions.ConnectionError as conn_ex:
return False, str(conn_ex)
except requests.exceptions.HTTPError as http_ex:
return False, str(http_ex)
La funzione solleva a sua volta l'eccezione ValueError
se viene invocata senza l'URL da testare. Restituisce una tuple il cui primo elemento rappresenta il risultato booleano della verifica e il secondo il messaggio di stato che, come si può notare, nel caso delle eccezioni del modulo requests è la versione della classe relativa in formato stringa.
Possiamo usare la nostra funzione in questo modo:
def main():
try:
res = get_url('https://gabrieleromanato.dev')
result, status = res
print(f'Result: {result}, Status: {status}')
except ValueError as e:
print(e)
if __name__ == '__main__':
main()
Esempio di output:
Result: True, Status: 200