Requests: رفع الاستثناء إذا كان رمز الحالة لا يساوي 200

تم إنشاؤها على ٢٧ يوليو ٢٠١٤  ·  3تعليقات  ·  مصدر: psf/requests

مرحبا،
غالبًا ما أتوقع أن يكون للطلب رمز الحالة 200 وإذا لم يكن هناك الكثير مما يمكنني فعله حيال (على محمل الجد عندما يعود الخادم بالخطأ 500 ، فلن أتمكن من القيام بشيء ما). لذلك أحتاج إلى كتابة رمز مثل هذا:

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

أعتقد أن kwarg المسمى allow_status_codes سيكون ملائمًا للغاية. يمكن تنفيذه على النحو التالي:
بشكل افتراضي هو None . None ، والقائمة الفارغة أو المجموعة تعني السماح بجميع أكواد الحالة. قد يكون عددًا صحيحًا أو قائمة أو مجموعة أو تعدادًا. إذا كان عددًا صحيحًا ، فلا تسمح إلا برمز الحالة المحدد هذا. في حال كانت قائمة أو مجموعة ، يُسمح فقط برموز الحالة الموجودة داخل القائمة / المجموعة. قد تحتوي القائمة على أعداد صحيحة و / أو تعدادات. يجب أن تكون الأرقام أكثر مرونة قليلاً.
على سبيل المثال ، إذا كنت أرغب في السماح لجميع الطلبات "الناجحة" (2xx) ، فيمكنني كتابة: allow_status_codes = applications.ALLOW_SUCCESS ، والذي سيرمي استثناء إلا إذا كان رمز الحالة هو 2xx. إذا أردت فقط عدم السماح بأخطاء الخادم (وبالتالي معالجة الأخطاء غير المصادق عليها) ، يمكنني ببساطة كتابة allow_status_codes =طلبات.DISALLOW_SERVER_ERROR ، والتي ستثير استثناءً إذا كان كود الخادم هو 5xx.
بالطبع يجب أن يكون هناك الكثير من التعدادات التي تغطي حالات معينة. ويجب أيضًا أن يكون المرء قادرًا على استخدامه معًا ضمن قائمة (على سبيل المثال (200, ALLOW_REDIRECTIONS) ).
إذا كان رمز الحالة غير مسموح به ، فسيتم رفع StatusCodeError(RequestException) .


على الرغم من أنني ذكرت التعدادات ، فأنا لا أتحدث عن القيم التي تم تعدادها في Python 3.4. كنت أتحدث بالأحرى عن الثوابت. يمكن تنفيذ Enums (الثوابت) على النحو التالي:

#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

التعليق الأكثر فائدة

أيضًا ، أليس لكل Response طريقة raise_for_status ستؤدي إلى استثناء إذا لم يكن رمز الحالة 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

ال 3 كومينتر

شكرا على هذه الفكرة!

ليس من الواضح سبب ارتباط ذلك بالطلبات نفسها. الكود المطلوب ليس معقدًا ، ولا أعتقد أننا سنضيف قيمة كبيرة من خلال وجود هذا الرمز في المكتبة. ومع ذلك ، فإننا _رغب_ في إضافة وسيطة أخرى لكلمة رئيسية إلى واجهة برمجة التطبيقات ، وهو أمر لا نرغب في القيام به في معظم الأوقات.

أيضًا ، أليس لكل Response طريقة raise_for_status ستؤدي إلى استثناء إذا لم يكن رمز الحالة 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 لأنه ملائم للغاية ، يمكنه حفظ الكثير من التعليمات البرمجية (دعنا نقول فقط أن المشروع يستخدم طلبًا. يستخدم هذا المشروع حوالي 100 مرة طلبًا. لذلك ، يمكنه حفظ 200 سطر من التعليمات البرمجية ، ومنع الأخطاء المطبعية لأنني سأضطر إلى الكتابة الاستثناء 100 مرة (في حالة عدم استخدام طريقة لإثارة استثناء) ، وهو يوحد الاستثناءات / الأخطاء (قد تستخدم واجهة برمجة تطبيقات أخرى الطلبات وتصدر خطأً مخصصًا في حالة وجود رمز حالة غير صالح. أحب ذلك بشكل أفضل إذا يطرح نفس الاستثناء كما يفعل الطلبات).

@ sigmavirus24 آسف ، لم أكن أعرف أن هذه الطريقة موجودة. يجب أن تذكر أنه يمكن رفع خطأ HTTPError من خلال lift_for_status في قسم الخطأ والاستثناءات في المستندات. يدعي خطأ HTTPError حاليًا أنه يتم رفعه فقط "في حالة نادرة لاستجابة HTTP غير صالحة".
يمكنك أيضًا التفكير في تنفيذ بعض أفكاري في حالة رفع_من أجل_حالة الخاصة بي بحيث تسمح برموز الحالة الأخرى أيضًا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات