Requests: Naikkan pengecualian jika kode status tidak sama dengan 200

Dibuat pada 27 Jul 2014  ·  3Komentar  ·  Sumber: psf/requests

Halo,
Saya sering berharap permintaan memiliki kode status 200 dan jika tidak, tidak banyak yang dapat saya lakukan (serius ketika server kembali dengan kesalahan 500, saya tidak akan dapat melakukan sesuatu). Jadi saya perlu menulis kode seperti ini:

    r = requests.get(self.url(False))
    if r.status_code != 200:
        raise requests.ConnectionError("Expected status code 200, but got {}".format(page.status_code))

Saya pikir kwarg yang disebut allow_status_codes akan sangat nyaman. Itu bisa diimplementasikan seperti ini:
Secara default adalah None . None , dan daftar atau tupel kosong berarti izinkan semua kode status. Ini mungkin bilangan bulat, daftar, tupel, atau enum. Jika bilangan bulat, hanya izinkan kode status khusus ini. Dalam hal ini adalah daftar atau tupel, hanya kode status yang ada di dalam daftar/tupel yang diperbolehkan. Daftar mungkin memiliki bilangan bulat dan/atau enum. Enum harus sedikit lebih fleksibel.
Misalnya, jika saya ingin mengizinkan semua permintaan "berhasil" (2xx), saya dapat menulis: allow_status_codes=requests.ALLOW_SUCCESS, yang akan mengeluarkan pengecualian kecuali kode statusnya adalah 2xx. Jika saya hanya ingin melarang kesalahan server (dan dengan demikian menangani kesalahan yang tidak diautentikasi), saya cukup menulis allow_status_codes=requests.DISALLOW_SERVER_ERROR, yang akan memunculkan pengecualian jika kode server adalah 5xx.
Tentu saja harus ada banyak enum yang mencakup kasus-kasus tertentu. Dan seseorang juga harus dapat menggunakannya dalam daftar (misalnya (200, ALLOW_REDIRECTIONS) ).
Jika kode status tidak diizinkan, StatusCodeError(RequestException) akan dinaikkan.


Meskipun saya menyebutkan enum, saya tidak berbicara tentang nilai enumerasi Python 3.4. Saya lebih banyak berbicara tentang konstanta. Enum (konstanta) dapat diimplementasikan seperti ini:

#request model.

ALLOW_SUCCESS = AllowSuccessEnum()
# other enums

class RequestEnum(object):
     def is_status_code_allowed(status_code):
         raise NotImplementedError

class AllowSuccessEnum(RequestEnum):
    def is_status_code_allowed(status_code):
        # return false unless status code is 2xx

Komentar yang paling membantu

Juga, bukankah setiap Response memiliki metode raise_for_status yang akan memunculkan pengecualian jika kode statusnya bukan 200?

Python 2.7.7 (default, Jun  2 2014, 18:55:26)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('http://httpbin.org/404')
>>> r
<Response [404]>
>>> r.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/requests/models.py", line 795, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND

Semua 3 komentar

Terima kasih untuk ide ini!

Tidak jelas mengapa ini termasuk dalam permintaan itu sendiri. Kode yang diperlukan tidak rumit, dan saya tidak yakin kami akan menambahkan banyak nilai dengan memiliki kode ini di perpustakaan. Kami _akan_, bagaimanapun, akan menambahkan argumen kata kunci lain ke API, yang merupakan sesuatu yang sering kami enggan lakukan.

Juga, bukankah setiap Response memiliki metode raise_for_status yang akan memunculkan pengecualian jika kode statusnya bukan 200?

Python 2.7.7 (default, Jun  2 2014, 18:55:26)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('http://httpbin.org/404')
>>> r
<Response [404]>
>>> r.raise_for_status()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/requests/models.py", line 795, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: NOT FOUND

@Lukasa Karena sangat nyaman, dapat menyimpan banyak kode (katakanlah sebuah proyek menggunakan permintaan. Proyek ini menggunakan sekitar 100 kali permintaan. Jadi, _bisa_ menyimpan 200 baris kode, dan mencegah kesalahan ketik karena saya harus menulis pengecualian 100 kali (jika saya tidak menggunakan metode untuk memunculkan pengecualian), dan itu menyatukan pengecualian/kesalahan (API lain dapat menggunakan permintaan dan meningkatkan kesalahan khusus jika kode status tidak valid. Saya lebih suka jika itu melempar pengecualian yang sama seperti permintaan).

@ sigmavirus24 Maaf, saya tidak tahu metode ini ada. Anda harus menyebutkan bahwa HTTPError dapat dimunculkan oleh raise_for_status di bagian Kesalahan dan Pengecualian di dokumen. HTTPError saat ini hanya mengklaim untuk dimunculkan "Dalam kejadian langka dari respons HTTP yang tidak valid".
Anda juga dapat mempertimbangkan untuk menerapkan beberapa ide saya ke dalam raise_for_status saya sehingga dapat memungkinkan kode status lainnya juga.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

eromoe picture eromoe  ·  3Komentar

remram44 picture remram44  ·  4Komentar

ReimarBauer picture ReimarBauer  ·  4Komentar

JimHokanson picture JimHokanson  ·  3Komentar

8key picture 8key  ·  3Komentar