الفرق بين المراجعتين لصفحة: «Python/urllib/request»
لا ملخص تعديل |
|||
سطر 274: | سطر 274: | ||
=== التابع <code>[[Python/urllib/request/FileHandler/file open|FileHandler.file_open()]]</code> === | === التابع <code>[[Python/urllib/request/FileHandler/file open|FileHandler.file_open()]]</code> === | ||
يفتح التابع الملفّ محلّيًا، إن لم يحدد اسم المضيف، أو كان اسم المضيف هو <code>'localhost'</code>. | |||
== كائنات <code>DataHandler</code> == | == كائنات <code>DataHandler</code> == | ||
سطر 279: | سطر 280: | ||
=== التابع <code>[[Python/urllib/request/DataHandler/data open|DataHandler.data_open()]]</code> === | === التابع <code>[[Python/urllib/request/DataHandler/data open|DataHandler.data_open()]]</code> === | ||
يقرأ التابع عنوان URL للبيانات. | |||
== كائنات <code>FTPHandler</code> == | == كائنات <code>FTPHandler</code> == | ||
سطر 284: | سطر 286: | ||
=== التابع <code>[[Python/urllib/request/FTPHandler/ftp open|FTPHandler.ftp_open()]]</code> === | === التابع <code>[[Python/urllib/request/FTPHandler/ftp open|FTPHandler.ftp_open()]]</code> === | ||
يفتح التابع ملف FTP المحدّد في الطلب المعطى. | |||
== كائنات <code>CacheFTPHandler</code> == | == كائنات <code>CacheFTPHandler</code> == | ||
سطر 289: | سطر 292: | ||
=== التابع <code>[[Python/urllib/request/CacheFTPHandler/setTimeout|CacheFTPHandler.setTimeout()]]</code> === | === التابع <code>[[Python/urllib/request/CacheFTPHandler/setTimeout|CacheFTPHandler.setTimeout()]]</code> === | ||
يحدّد التابع المهلة المسموحة للاتصالات بالثواني. | |||
=== التابع <code>[[Python/urllib/request/CacheFTPHandler/setMaxConns|CacheFTPHandler.setMaxConns()]]</code> === | === التابع <code>[[Python/urllib/request/CacheFTPHandler/setMaxConns|CacheFTPHandler.setMaxConns()]]</code> === | ||
يحدّد التابع العدد الأقصى للاتصالات المخزّنة في الذاكرة الخبيئة. | |||
== كائنات <code>UnknownHandler</code> == | == كائنات <code>UnknownHandler</code> == |
مراجعة 20:53، 2 فبراير 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)
.
يعدّ الحقل None حقلًا عامًّا ويجري البحث عنه في حال عدم مطابقة أي حقل آخر.
الصنف 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 الخاصة بالأخطاء.
كائنات OpenerDirector
تفتح كائنات OpenerDirector
عناوين URL عبر ثلاث مراحل، ويُحدّد ترتيب استدعاء هذا التوابع في كلّ مرحلة عن طريق ترتيب نسخ أصناف المعالجة.
- كلّ معالج يمتلك تابعًا يحمل اسمًا مثل
protocol_request()
سيستدعي ذلك التابع للمعالجة القبلية pre-process للطلب. - المعالجات التي تمتلك تابعًا يحمل اسمًا مثل
protocol_open()
ستستدعى لمعالجة الطلب. تنتهي هذه المرحلة عندما يعيد معالجٌ ما قيمة غير القيمةNone
(أي يعيد استجابة) أو عندما يطلق استثناءً (عادة ما يكونURLError
)، ويُسمح للاستثناءات بالتكرار. تجري تجربة الخوارزمية السابقة مع التوابع التي تحمل اسمًا مثلdefault_open()
، وإن أعادت جميع هذه التوابع القيمةNone
، فإنّ الخوارزمية ستُعاد مع التوابع التي تحمل اسمًا مثلprotocol_open()
، وإن أعادت جميع هذه التوابع القيمةNone
، فإنّ الخوارزمية ستُعاد مع التوابع التي تحمل اسمًا مثلunknown_open()
. يجدر الانتباه إلى أنّ استخدام هذه التوابع قد يتضمّن استدعاءات للتابعينopen()
وerror()
في نسخة الصنفOpenerDirector
الأب. - كلّ معالج يمتلك تابعًا يحمل اسمًا مثل
protocol_response()
سيستدعي ذلك التابع للمعالجة البعدية post-process للاستجابة.
تمتلك كائنات OpenerDirector
التوابع التالية:
التابع OpenerDirector.add_handler()
يضيف التابع صنف معالجة إلى كائن OpenerDirector
.
التابع OpenerDirector.open()
يفتح التابع العنوان المعطى.
التابع OpenerDirector.error()
يعالج هذا التابع خطأً معيّنًا في البروتوكول المعطى.
كائنات BaseHandler
تقدّم كائنات BaseHandler
تابعين يمكن الاستفادة منهما مباشرة، وعددًا من التوابع التي أعدّت للاستخدام بواسطة الأصناف المشتّقة من هذه الكائنات.
يُستخدم التابعان التاليان مباشرة:
التابع BaseHandler.add_parent()
يضيف التابع الموجّه المعطى كموجّه أب.
التابع BaseHandler.close()
يحذف التابع أي موجّهات أبوية.
يجب استخدام التوابع والخصائص التالية من قبل الأصناف المشتقّة من الصنف BaseHandler
فقط.
ملاحظة
جرى الاتفاق على تسمية الأصناف الفرعية التي تعرّف التابع protocol_request()
أو protocol_response()
بالاسم *Processor
، وتُسمّى الأصناف الفرعية الأخرى بالاسم *Handler
.
الخاصية BaseHandler.parent
كائن OpenerDirector
صالح للاستخدام، والذي يمكن استخدامه لفتح العناوين باستخدام بروتكول مختلف أو لمعالجة الأخطاء.
التابع BaseHandler.default_open()
هذا التابع غير معرّف في الصنف BaseHandler
، ولكن يجب على الأصناف المتفرّعة منه أن تعرّف هذا التابع إن كان المطلوب التقاط جميع عناوين URL.
التابع BaseHandler.protocol_open()
هذا التابع غير معرّف في الصنف BaseHandler
، ولكن يجب على الأصناف المتفرّعة منه أن تعرّف هذا التابع إن كان المطلوب معالجة عناوين URL مع البروتوكول المعطى.
التابع BaseHandler.unknown_open()
هذا التابع غير معرّف في الصنف BaseHandler
، ولكن يجب على الأصناف المتفرّعة منه أن تعرّف هذا التابع إن كان المطلوب التقاط جميع عناوين URL دون تحديد أيّ معالج مسجّل لفتح هذه العناوين.
التابع BaseHandler.http_error_default()
يُستدعى هذا التابع تلقائيًا بواسطة كائن OpenerDirector
الذي يتلقّى الخطأ، ويجب عدم استدعائه في الظروف الأخرى.
التابع BaseHandler.http_error_nnn()
هذا التابع غير معرّف في الصنف BaseHandler
أيضًا، ولكن سيُستدعى إن كان موجودًا على نسخة من الصنف المتفرّع عن الصنف BaseHandler
عند حدوث خطأ HTTP يحمل الشيفرة nnn
.
التابع BaseHandler.protocol_request()
هذا التابع غير معرّف في الصنف BaseHandler
، ولكن يجب على الأصناف المتفرّعة منه أن تعرّف هذا التابع إن كان المطلوب إجراء معالجة قبلية للطلبات الخاصّة بالبروتكول المعطى.
التابع BaseHandler.protocol_response()
هذا التابع غير معرّف في الصنف BaseHandler
، ولكن يجب على الأصناف المتفرّعة منه أن تعرّف هذا التابع إن كان المطلوب إجراء معالجة بعدية للاستجابات الخاصّة بالبروتكول المعطى.
كائنات HTTPRedirectHandler
ملاحظة:
تحتاج بعض عمليات إعادة التوجيه في HTTP إلى بعض الأحداث من شيفرة الوحدة التابعة للعميل، وتُطلق الوحدة الاستثناء HTTPError
إن كانت هذه هيه الحالة. راجع المعيار RFC 2616 للمزيد من التفاصيل حول المعنى الدقيق لشيفرات إعادة التوجيه المختلفة.
يُطلق الاستثناء HTTPError
كإجراء احترازي إن حصل المعالج HTTPRedirectHandler
على عنوان URL لا ينتمي إلى بروتكولات HTTP أو HTTPS أو FTP.
تقدم كائنات HTTPRedirecthandler
التوابع التالية:
التابع HTTPRedirectHandler.redirect_request()
يعيد التابع كائن Request
أو القيمة None
استجابةً لعملية إعادة توجيه.
التابع HTTPRedirectHandler.http_error_301()
يعيد التابع التوجيه إلى عنوان Location:
أو URI:
.
التابع HTTPRedirectHandler.http_error_302()
هذا التابع مشابه للتابع http_error_301()
ولكن يُستدعى للاستجابة (found).
التابع HTTPRedirectHandler.http_error_303()
هذا التابع مشابه للتابع http_error_301()
ولكن يُستدعى للاستجابة (see other).
التابع HTTPRedirectHandler.http_error_307()
هذا التابع مشابه للتابع http_error_301()
ولكن يُستدعى للإجابة (temporary redirect).
كائنات HTTPCookieProcessor
تمتلك كائنات HTTPCookieProcessor
خاصّية واحدة فقط:
الخاصية HTTPCookieProcessor.cookiejar
كائن http.cookiejar.Cookiejar
الذي ستخزّن الكعكات فيه.
كائنات ProxyHandler
تقدّم كائنات ProxyHandler التابع التالي:
التابع ProxyHandler.protocol_open()
يعدّل التابع الطلبات لتمرّ عبر الوسيط وذلك باستدعاء التابع request.set_proxy()
واستدعاء الصنف المعالج التالي في سلسلة الأصناف المعالجة وذلك لتنفيذ البروتوكول.
كائنات HTTPPasswordMgr
التوابع التالية متوفّرة في كائنات HTTPPasswordMgr
و HTTPPasswordMgrWithDefaultRealm
.
التابع HTTPPasswordMgr.add_password()
يؤدي استدعاء هذا التابع إلى استخدام الصفّ (user, passwd)
علامات استيثاق رمزية authentication tokens عند إعطاء الاستيثاق للحقل المعطى و المعرفات الفوقية super-URI للمعرّفات المعطاة.
التابع HTTPPasswordMgr.find_user_password()
يجلب التابع اسم المستخدم وكلمة المرور للحقل realm أو عنوان URI المعطيين.
كائنات HTTPPasswordMgrWithPriorAuth
يوسّع مدير كلمات المرور هذا عمل كائنات HTTPPasswordMgrWithDefaultRealm
لدعم عملية تعقّب معرّفات URI التي يجب إرسال معلومات الاستيثاق إليها دائمًا.
تمتلك كائنات HTTPPasswordMgrWithPriorAuth
التوابع التالية:
التابع HTTPPasswordMgrWithPriorAuth.add_password()
التابع HTTPPasswordMgrWithPriorAuth.find_user_password()
هذا التابع مشابه للتابع HTTPPasswordMgr.find_user_password()
.
التابع HTTPPasswordMgrWithPriorAuth.update_authenticated()
يحدّث التابع قيمة الراية is_authenticated
لعنوان URI المعطى أو قائمة عناوين URI المعطاة.
التابع HTTPPasswordMgrWithPriorAuth.is_authenticated()
يعيد التابع حالة راية is_authenticated
الحالية لعنوان URI المعطى.
كائنات AbstractBasicAuthHandler
تمتلك هذه الكائنات التابع التالي:
التابع AbstractBasicAuthHandler.http_error_auth_reqed()
يعالج التابع طلب الاستيثاق عن طريق الحصول على زوج اسم المستخدم/كلمة المرور، وإعادة الطلب مرة أخرى.
كائنات HTTPBasicAuthHandler
تمتلك هذه الكائنات التابع التالي:
التابع HTTPBasicAuthHandler.http_error_401()
يعيد التابع إرسال الطلب مع معلومات الاستيثاق إن كانت متوفّرة.
كائنات ProxyBasicAuthHandler
تمتلك هذه الكائنات التابع التالي:
التابع ProxyBasicAuthHandler.http_error_407()
يعيد التابع إرسال الطلب مع معلومات الاستيثاق، إن كانت متوفّرة.
كائنات AbstractDigestAuthHandler
التابع AbstractDigestAuthHandler.http_error_auth_reqed()
كائنات HTTPDigestAuthHandler
تمتلك هذه الكائنات التابع التالي:
التابع HTTPDigestAuthHandler.http_error_401()
كائنات ProxyDigestAuthHandler
تمتلك هذه الكائنات التابع التالي:
التابع ProxyDigestAuthHandler.http_error_407()
كائنات HTTPHandler
تمتلك هذه الكائنات التابع التالي:
التابع HTTPHandler.http_open()
كائنات HTTPSHandler
تمتلك هذه الكائنات التابع التالي:
التابع HTTPSHandler.https_open()
كائنات FileHandler
تمتلك هذه الكائنات التابع التالي:
التابع FileHandler.file_open()
يفتح التابع الملفّ محلّيًا، إن لم يحدد اسم المضيف، أو كان اسم المضيف هو 'localhost'
.
كائنات DataHandler
تمتلك هذه الكائنات التابع التالي:
التابع DataHandler.data_open()
يقرأ التابع عنوان URL للبيانات.
كائنات FTPHandler
تمتلك هذه الكائنات التابع التالي:
التابع FTPHandler.ftp_open()
يفتح التابع ملف FTP المحدّد في الطلب المعطى.
كائنات CacheFTPHandler
هذه الكائنات هي كائنات FTPHandler
مع التوابع الإضافية التالية:
التابع CacheFTPHandler.setTimeout()
يحدّد التابع المهلة المسموحة للاتصالات بالثواني.
التابع CacheFTPHandler.setMaxConns()
يحدّد التابع العدد الأقصى للاتصالات المخزّنة في الذاكرة الخبيئة.
كائنات UnknownHandler
تمتلك هذه الكائنات التابع التالي:
التابع UnknownHandler.unknown_open()
يطلق هذا التابع الاستثناء URLError
.
كائنات HTTPErrorProcessor
تمتلك هذه الكائنات التابع التالي:
التابع HTTPErrorProcessor.http_response()
التابع HTTPErrorProcessor.https_response()
الواجهة القديمة
الدوال والأصناف التالية منقولة من الوحدة 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
حسب الحاجة.