İstekler - 404 alıp almadığınızı nasıl anlarsınız?


139

İstekler kitaplığını kullanıyorum ve aşağıdaki kodla ondan veri toplamak için bir web sitesine erişiyorum:

r = requests.get(url)

Uygunsuz bir URL girildiğinde ve bir 404 hatası döndürüldüğünde hata testi eklemek istiyorum. Kasıtlı olarak geçersiz bir URL girersem, bunu yaptığımda:

print r

Bunu anlıyorum:

<Response [404]>

DÜZENLE:

Bunu nasıl test edeceğimi bilmek istiyorum. Nesne türü hala aynı. Yaptığımda r.contentveya r.text, sadece özel bir 404 sayfasının HTML'sini alıyorum.


2
Belgelere bakın: docs.python-requests.org/en/latest İlk sayfada r.status_code
Udo Klein

Yanıtlar:


309

Bak r.status_codeözniteliği :

if r.status_code == 404:
    # A 404 was issued.

Demo:

>>> import requests
>>> r = requests.get('http://httpbin.org/status/404')
>>> r.status_code
404

requestsHata kodları (4xx veya 5xx) için bir istisna oluşturmak istiyorsanız , arayın r.raise_for_status():

>>> r = requests.get('http://httpbin.org/status/404')
>>> r.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "requests/models.py", line 664, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND
>>> r = requests.get('http://httpbin.org/status/200')
>>> r.raise_for_status()
>>> # no exception raised.

Yanıt nesnesini mantıksal bir bağlamda da test edebilirsiniz; durum kodu bir hata kodu (4xx veya 5xx) değilse, "doğru" olarak kabul edilir:

if r:
    # successful response

Daha açık olmak istiyorsanız kullanın if r.ok:.


1
Lanet olsun bu can sıkıcı. Keşke istekleri almanın bir yolu olsaydı, fazladan arama yapmak zorunda kalmadan 2XX dışında herhangi bir nedenle yükseltmeyi unut.
Asfand Qazi

@AsfandQazi: 1xx veya 3xx durum kodu için neden bir istisna oluşturmak isteyesiniz? Bunlar hata koşulları değildir.
Martijn Pieters

2
1xx ve 3xx, kütüphane tarafından şeffaf bir şekilde ele alınmalıdır. Özellikle 4xx hatalarından bahsediyordum. Elbette bazen bir 4xx yanıtını okumak isteyebilirsiniz, bu yüzden bunu herkese empoze etmemeliyiz, ancak keşke .get()daha sonra bir işlevi çağırmak yerine geçebileceğiniz bir bayrak olsaydı .
Asfand Qazi

@AsfandQazi: Sizin için önemliyse, kendi sarmalayıcı işlevinizi yazmak önemsizdir.
Martijn Pieters

1
Biraz dağınık görünüyor, hepsi bu
Asfand Qazi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.