الفرق بين المراجعتين ل"Python/urllib/request"

من موسوعة حسوب
< Python‏ | urllib
اذهب إلى التنقل اذهب إلى البحث
سطر 32: سطر 32:
 
يعدّ هذا الصنف تجريدًا abstraction لطلب URL.
 
يعدّ هذا الصنف تجريدًا abstraction لطلب URL.
  
=== الصنف <code>[[Python/urllib/request/OpenerDirector|urllib.request.OpenerDirector]]</code> ===
+
=== الصنف <code>urllib.request.OpenerDirector</code> ===
 
يفتح هذا الصنف عناوين URL بواسطة الصنف <code>[[Python/urllib/request/BaseHandler|BaseHandlers]]</code> المرتبط به. يتحكّم هذا الصنف بعملية ربط الأصناف المعالجة بعضها ببعض، والتعافي من الأخطاء.
 
يفتح هذا الصنف عناوين URL بواسطة الصنف <code>[[Python/urllib/request/BaseHandler|BaseHandlers]]</code> المرتبط به. يتحكّم هذا الصنف بعملية ربط الأصناف المعالجة بعضها ببعض، والتعافي من الأخطاء.
  
=== الصنف <code>[[Python/urllib/request/BaseHandler|urllib.request.BaseHandler]]</code> ===
+
=== الصنف <code>urllib.request.BaseHandler</code> ===
 
الصنف الأساسي لجميع أصناف المعالجة المسجّلة، ويعالج عملية التسجيل البسيطة فقط.
 
الصنف الأساسي لجميع أصناف المعالجة المسجّلة، ويعالج عملية التسجيل البسيطة فقط.
  
سطر 47: سطر 47:
 
يعالج هذا الصنف كعكات HTTP.
 
يعالج هذا الصنف كعكات HTTP.
  
=== الصنف <code>urllib.request.ProxyHandler</code> ===
+
=== الصنف <code>[[Python/urllib/request/ProxyHandler|urllib.request.ProxyHandler]]</code> ===
 +
يتسبب هذا الصنف في تمرير الطلبات عبر وسيط معيّن.
  
 
=== الصنف <code>urllib.request.HTTPPasswordMgr</code> ===
 
=== الصنف <code>urllib.request.HTTPPasswordMgr</code> ===

مراجعة 20:18، 26 يناير 2019

تقدّم وحدة urllib.request عددًا من الدوال والأصناف التي تساعد في فتح عناوين URL‏ (HTTP في الغالب) لاستخدامها في عمليات مختلفة مثل الاستيثاق البسيط وإعادة التوجيه والتعامل مع الكعكات cookies وغيرها.

ملاحظة: يُنصح باستخدام الحزمة Requests في العمليات المتقدّمة لأنّها توفّر واجهة برمجية ذات مستوى أعلى.

دوالّ الوحدة urllib.request

تقدّم وحدة urllib.request الدوال التالية:

الدالة urllib.request.urlopen()

تفتح الدالة عنوان URL المعطى.

urllib.request.install_opener()‎

تثبّت الدالة نسخة من الصنف OpenerDirector كفاتح opener افتراضي عام.

urllib.request.build_opener()‎

تعيد الدالة نسخة من الصنف OpenerDirector والتي تربط بين المعالجات handlers حسب الترتيب المعطى. 

urllib.request.pathname2url()‎

تحوّل الدالة المسار المعطى من الصيغة المستخدمة في المسارات المحلية إلى الصيغة المستخدمة في عناوين URL.

urllib.request.url2pathname()‎

تحوّل الدالة مكونات المسار المعطى من عنوان URL مرمّز بعلامة النسبة المئوية إلى الصيغة المحلّية للمسارات. 

urllib.request.getproxies()‎

تعيد هذه الدالة المساعدة قاموسًا يربط بين المخطّط scheme وعناوين URL في مخدّم الوسيط. 

أصناف الوحدة urllib.request

تقدّم الوحدة الأصناف التالية:

الصنف urllib.request.Request

يعدّ هذا الصنف تجريدًا abstraction لطلب URL.

الصنف urllib.request.OpenerDirector

يفتح هذا الصنف عناوين URL بواسطة الصنف BaseHandlers المرتبط به. يتحكّم هذا الصنف بعملية ربط الأصناف المعالجة بعضها ببعض، والتعافي من الأخطاء.

الصنف urllib.request.BaseHandler

الصنف الأساسي لجميع أصناف المعالجة المسجّلة، ويعالج عملية التسجيل البسيطة فقط.

الصنف urllib.request.HTTPDefaultErrorHandler

يعرّف هذا الصنف معالجًا افتراضيًا للاستجابات الخاصّة بأخطاء HTTP، وتحوّل جميع الاستجابات إلى استثناءات HTTPError.

الصنف urllib.request.HTTPRedirectHandler

يعالج هذا الصنف عمليات إعادة التوجيه redirection.

الصنف urllib.request.HTTPCookieProcessor

يعالج هذا الصنف كعكات HTTP.

الصنف urllib.request.ProxyHandler

يتسبب هذا الصنف في تمرير الطلبات عبر وسيط معيّن.

الصنف urllib.request.HTTPPasswordMgr

يحتفظ الصنف بقاعدة بيانات من روابط ‎(realm, uri) -> (user, password).

الصنف urllib.request.HTTPPasswordMgrWithDefaultRealm

يحتفظ الصنف بقاعدة بيانات من روابط ‎(realm, uri) -> (user, password).

A realm of None is considered a catch-all realm, which is searched if no other realm fits.

الصنف urllib.request.HTTPPasswordMgrWithPriorAuth

شكل مختلف من الصنف HTTPPasswordMgrWithDefaultRealm ويمتلك قاعدة بيانات فيها روابط ‎uri -> is_authenticated. يمكن استخدام هذا الصنف بواسطة الصنف المعالج BasicAuth لتحديد متى يمكن إرسال معلومات الاستيثاق مباشرة دون الحاجة إلى انتظار الاستجابة 401 أوّلًا. ملاحظة: هذا الصنف جديد في الإصدار 3.5 من بايثون.

الصنف urllib.request.AbstractBasicAuthHandler

صنف مخلوط mixin class يساعد في عمليات استيثاق HTTP لكلٍّ من المضيف البعيد remote host والوسيط proxy.

الصنف urllib.request.HTTPBasicAuthHandler

يعالج هذا الصنف عملية الاستيثاق مع المضيف البعيد.

الصنف urllib.request.ProxyBasicAuthHandler

يعالج هذا الصنف عملية الاستيثاق مع الوسيط.

الصنف urllib.request.AbstractDigestAuthHandler

صنف مخلوط mixin class يساعد في عمليات استيثاق HTTP لكلٍّ من المضيف البعيد remote host والوسيط proxy.

الصنف urllib.request.HTTPDigestAuthHandler

يعالج هذا الصنف عملية الاستيثاق مع المضيف البعيد.

الصنف urllib.request.ProxyDigestAuthHandler

يعالج هذا الصنف عملية الاستيثاق مع الوسيط.

الصنف urllib.request.HTTPHandler

يعالج هذا الصنف عملية فتح عناوين HTTP.

الصنف urllib.request.HTTPSHandler

يعالج هذا الصنف عملية فتح عناوين HTTPS.

الصنف urllib.request.FileHandler

يفتح ملفًّا محلّيًا.

الصنف urllib.request.DataHandler

يفتح عنوان بيانات.

ملاحظة: هذا الصنف جديد في الإصدار 3.4 من بايثون.

الصنف urllib.request.FTPHandler

يفتح عناوين FTP.

الصنف urllib.request.CacheFTPHandler

يفتح عناوين FTP ويحتفظ باتصالات FTP المفتوحة في الذاكرة المؤقتة وذلك تجنّبًا للتأخير.

الصنف urllib.request.UnknownHandler

صنف شامل لمعالجة العناوين المجهولة.

الصنف urllib.request.HTTPErrorProcessor

صنف لمعالجة استجابات HTTP الخاصة بالأخطاء.

كائنات Request

تصف التوابع التالية الواجهة العامة لكائنات Request ويمكن إعادة تعريف هذه التوابع في الأصناف المتفرّعة عن هذا الصنف. تقدّم هذه الكائنات كذلك مجموعة من الخصائص العامة التي يمكن استخدامها بواسطة العميل لتعقّب الطلب المفسّر.

Request.full_url

عنوان URL الأصلي والممرّر إلى الدالة البانية.

يمكن تعيين قيمة للخاصية Request.full_url إضافة إلى قراءة القيمة وحذفها. تعيد عملية قراءة القيمة عنوان الطلب الأصلي مع القطعة fragment إن كانت موجودة.

Request.type

مخطط URI.

Request.host

صلاحية URI، عادة تكون مضيفًا، ولكن يمكن أن يتضمّن منفذًا مفصولًا عن المضيف بنقطتين رأسيتين.

Request.origin_req_host

المضيف الأصلي للطلب، من دون المنفذ.

Request.selector

مسار URI. إن استخدم كائن Request وسيطًا، فإنّ المنتقي سيكون عنوان URL الكامل الذي مُرِّر إلى الوسيط.

Request.data

متن الطلب، أو القيمة None في حال عدم تعيينه.

ملاحظة: في الإصدار 3.4 من بايثون يؤدي تغيير قيمة Request.data إلى حذف الترويسة "Content-Length" إن كانت معيّنة أو محسوبة في السابق.

Request.unverifiable

قيمة منطقية تحدّد ما إذا كان الطلب غير قابل للتوثيق unverifiable كما هو معرّف في المعيار RFC 2965.

Request.method

تحدّد هذه الخاصية الطريقة المتّبعة لإرسال طلب HTTP. القيمة الافتراضية لهذه الخاصية هي None، والتي تعني أنّ التابع get_method()‎ سيؤدي عملها بصورة طبيعية. يمكن تعيين قيمة هذه الخاصية (وإعادة تعريف طريقة العمل الافتراضية للتابع get_method()‎) إمّا بتقديم قيمة افتراضية عن طريق تعيينها على مستوى الصنف في الأصناف المتفرّعة من الصنف Request، أو بتمرير القيمة إلى الدالة البانية للصنف Request عبر الوسيط method.

ملاحظات:

  • هذه الخاصية جديدة في الإصدار 3.3 من بايثون.
  • في الإصدار 3.4 من بايثون أصبح بالإمكان تعيين قيمة افتراضية في الصنف الفرعي، أما في الإصدارات السابقة فقد كانت الطريقة الوحيدة هي تعيين القيمة في الدالة البانية.

كائنات OpenerDirector

تمتلك كائنات OpenerDirector التوابع التالية:

التابع OpenerDirector.add_handler()‎

التابع OpenerDirector.open()‎

التابع OpenerDirector.error()‎

كائنات BaseHandler

تقدّم كائنات BaseHandler تابعين يمكن الاستفادة منهما مباشرة، وعددًا من التوابع التي أعدّت للاستخدام بواسطة الأصناف المشتّقة من هذه الكائنات.

يُستخدم التابعان التاليان مباشرة:

التابع BaseHandler.add_parent()‎

يضيف التابع الموجّه المعطى كموجّه أب.

التابع BaseHandler.close()‎

يحذف التابع أي موجّهات أبوية.

يجب استخدام التوابع والخصائص التالية من قبل الأصناف المشتقّة من الصنف BaseHandler فقط.

كائنات HTTPRedirectHandler

كائنات HTTPCookieProcessor

تمتلك كائنات HTTPCookieProcessor خاصّية واحدة فقط:

الخاصية HTTPCookieProcessor.cookiejar

كائن http.cookiejar.Cookiejar الذي ستخزّن الكعكات فيه.

كائنات ProxyHandler

كائنات HTTPPasswordMgr

كائنات HTTPPasswordMgrWithPriorAuth

يوسّع مدير كلمات المرور هذا عمل كائنات HTTPPasswordMgrWithDefaultRealm لدعم عملية تعقّب معرّفات URI التي يجب إرسال معلومات الاستيثاق إليها دائمًا.

كائنات AbstractBasicAuthHandler

كائنات HTTPBasicAuthHandler

كائنات ProxyBasicAuthHandler

كائنات AbstractDigestAuthHandler

كائنات HTTPDigestAuthHandler

كائنات ProxyDigestAuthHandler

كائنات HTTPHandler

كائنات HTTPSHandler

كائنات FileHandler

كائنات DataHandler

كائنات FTPHandler

كائنات CacheFTPHandler

كائنات UnknownHandler

كائنات HTTPErrorProcessor

الواجهة القديمة

الدوال والأصناف التالية منقولة من الوحدة urllib في الإصدار الثاني من بايثون (وليست من الوحدة urllib2)، وقد تصبح مهملة في المستقبل:

الدالة urllib.request.urlretrieve()‎

الدالة urllib.request.urlcleanup()‎

تحذف الدالة الملفات المؤقتة التي خلّفتها الاستدعاءات السابقة للدالة urlretrieve()‎.

الصنف urllib.request.URLopener

هذا هو الصنف الأساسي لفتح وقراءة عناوين URL. إن لم تكن ترغب في دعم فتح الكائنات باستخدام مخطّطات http:‎ أو ftp:‎ أو file، فستحتاج على الأرجح إلى استخدام الصنف FancyURLopener.

الصنف urllib.request.FancyURLopener

يتفرّع الصنف FancyURLopener من الصنف URLopener ويقدّم معالجة افتراضية لشيفرات استجابة HTTP التالية: 301، 302، 303، 307، 401.

محدّدات وحدة urllib.request

  • البروتوكولات المدعومة في الوقت الحاضر هي: HTTP (الإصداران 0.9 و 1.0) وFTP والملفات المحلية وعناوين URL للبيانات.

ملاحظة: أضيف دعم عناوين URL للبيانات في الإصدار 3.4 من بايثون.

  • خاصية التخزين في الذاكرة المخبئية caching للدالة urlretrieve()‎ معطلة إلى أن يجد شخصٌ ما الوقت الكافي لتطوير طريقة معالجة مناسبة لترويسات Expiration time.
  • يجب أن تكون هناك دالة للاستعلام عمّا إذا كان عنوان URL معيّن مخزّنًا في الذاكرة المخبئية.
  • إن أشار عنوان URL إلى ملف محلي ولم يكن بالإمكان فتح ذلك الملف، فإنّ عنوان URL سيفسّر مرّة أخرى باستخدام بروتوكول FTP، وذلك لأغراض التوافق مع الإصدارات السابقة من بايثون. قد يؤدي هذا السلوك إلى الحصول على رسائل أخطاء مربكة.
  • يمكن أن تتسبّب الدالتان urlopen()‎ و urlretrieve()‎ في حدوث فترات تأخير طويلة وذلك في انتظار تهيئة اتصال الشبكة. وهذا يعني صعوبة بناء عميل ويب تفاعلي باستخدام هذه الدوال دون اللجوء إلى الخيوط threads.
  • تكون البيانات المعادة من الدالة urlopen()‎ أو urlretrieve()‎ هي البيانات الخام المعادة من المخدّم، والتي يمكن أن تكون بيانات ثنائية (مثل الصور) أو بيانات نصية صرفة أو HTML. يقدّم بروتوكول HTTP نوع البيانات في ترويسة الرد reply header، والتي يمكن تعقبّها باستخدام ترويسة Content-Type. إن كانت البيانات المعادة من نوع HTML، فيمكن استخدام الوحدة html.parser لتحليلها.
  • لا يمكن للشيفرة التي تعالج بروتوكول FTP أن تميّز بين الملف والمجلّد، ويمكن لهذا أن يتسبب في حدوث أخطاء غير متوقعة عند محاولة قراءة عنوان URL يشير إلى ملف لا يمكن الوصول إليه. إن انتهى عنوان URL بالرمز / فستفترض الشيفرة أنّه يشير إلى مجلد وستتعامل معه على أساس ذلك. ولكن إن أدّت محاولة قراءة ملفّ إلى التسبّب في الخطأ 550 (ما يعني أنّ عنوان URL غير موجود أو غير قابل للوصول إليه، وغالبًا ما يحدث ذلك بسبب الأذونات) فإنّ المسار سيعامل معاملة المجلّد وذلك لمعالجة الحالة التي يُحدّد فيها المجلّد بواسطة عنوان URL ولكن مع ترك علامة / في نهاية العنوان. يمكن أن يؤدي هذا الأمر إلى الحصول على نتائج مضللة عند محاولة جلب ملفّ لا تسمح أذوناته بقرائته، وذلك لأنّ شيفرة FTP ستحاول قراءة هذا الملف، فتفشل العملية ويعاد الخطأ 550، ثم تسرد الشيفرة محتويات المجلّد التي تكون غير قابلة للقراءة. يمكن التحكّم بصورة أكبر في هذا الأمر عن طريق استخدام الوحدة ftplib، أو تفريع الصنف FancyURLopener أو تغيير ‎_urlopener حسب الحاجة.

مصادر