Urllib2 мүмкіндіктері
urllib и urlparse модулдерінің функциональдығы, веб-клиенттер сияқты сценарийлерді Python-да шешетін, көптеген тапсырмаларға жетеді. Соған қарамастан кейде одан көп талап етіледі. Бұл жағдайға httplib - HTTP хаттамасымен жұмыс істеу үшін модулін қолдануға және HTTP-сұранысы үшін жекеменшік класс құруға болады (дәрісте httplib модулі қарастырылмаған). Алайда, керекті функциональдылық urllib2 модулінде бар болуы әбден мүмкін.
Осы модулдердің тиімді мүмкіндіктерінің бірі – рұқсатты талап ететін веб-обьектіге қолжетімділік. Төменде тек қана рұқсаттпен қолжетімділікті қамтымайды, сонымен қатар urllib2 модулінің негізгі ойын көрсететін мысалы қарастырылған: әрбіреуі тар спецификалық тапсырмаларды шешетін өңдерушілерді (handlers) қолдану.
Келесі мысал urllib2 модулі көмегімен жекеменшік URL ашушыны қалай құру керек екенін көрсетеді (бұл мысал Python-дағы құжаттамасынан алынған).
import urllib2
# Идентификациялық мәліметтерді дайындау
authinfo = urllib2.HTTPBasicAuthHandler()
authinfo.add_password('My page', 'localhost', 'user1', 'secret')
# прокси арқылы қолжетімділік
proxy_support = urllib2.ProxyHandler({'http' : 'http://localhost:8080'})
# өңдірушілермен көрсетілген жаңа ашушыны құру
opener = urllib2.build_opener(proxy_support,
authinfo,
urllib2.CacheFTPHandler)
# клиент атауымен берілген өрісті орнату
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
# үнсіз келісім бойынша жаңа ашушыны орнату
urllib2.install_opener(opener)
# ашушыны қолдану
f = urllib2.urlopen('http://localhost/mywebdir/')
print f.read()[:100]
Бұл мысалда, mod_python қорғайтын (алдындағы дәрісті қараңыз), парақшаға қолжетімділік алынды. add_password() әдісін шақыру кезіндегі бірінші аргумент идентификациялық мәліметтердің (ол веб-сервердің конфигурациясындағы AuthName "My page" директивасымен берілген) облыс іс-әрекетін (realm) береді. Қалған параметрлер жеткілікті түрде түсінікті:қолжетімділікті алу керек хост атауы, қолданушы аты және оның кілттік сөзі. Әлбетте, мысалдың дұрыс жұмыс істеуі үшін локальды веб-серверде рұқсатты талап етуші каталог болуы керек.
Осы мысалда айқын түрде тек үш өңдіруші қозғалған: HTTPBasicAuthHandler, ProxyHandler и CacheFTPHandler. urllib2 модулінде олар оннан аса, әрбіреуінің тағайындалуын Python қолданысындағы нұсқасының құжаттамасынан білуге болады. Ашушыларды басқару үшін арнайы класстарда бар: OpenerDirector. Дәл оның данасы urllib2.build_opener() функциясын құрды.
urllib2 модулі URL ашуға сұраныстарды іске асыру үшін арнайы класстары да бар. Бұл класс urllib2.Request деп аталады. Оның данасы сұраныстың күйін қамтиды. Келесі мысал HTTP-сұранысына тақырыпшаны қосуды қолдана отырып, рұқсатпен берілген каталогке қалай қолжетімділікті алуға болатынын көрсетеді.
import urllib2, base64
req = urllib2.Request('http://localhost/mywebdir')
b64 = base64.encodestring('user1:secret').strip()
req.add_header('Authorization', 'Basic %s' % b64)
req.add_header('User-agent', 'Mozilla/5.0')
f = urllib2.urlopen(req)
print f.read()[:100]
Бұл мысалда көрініп тұрғандай, авторизацияда тылсым ештене жоқ: веб-клиент идентификациялық мәліметті HTTP-сұрауының Authorization өрісіне енгізеді (кодталған base64).
Ескерту:
Келтірілген екі мысал баламалы, тек екінші мысалда прокси-сервер ашық көрсетілмеген.
XML-RPC сервері
Осы күнге дейін кеңауқымды хаттамалар клиент көзқарасымен қарастырылды. Python-да жай ғана құру және олардың серверлік бөліктерін құру аз емес. Іске асыратын серверді, Python-да бағдарламада қалай өңдеу керек екендігін, иллюстрациялау үшін XML-RPC хаттамасы таңдалған болатын. Атауына қарамастан соңғы қолданушыға XML білудің қажеті жоқ, себебі, ол одан жасырынып тұрғандықтан. RPC қысқартылуы (Remote Procedure Call, қашықтықтағы процедураны шақыру) істің мәнін түсіндіреді: XML-RPC көмегімен қашықтықтағы хостта процедураларды шақыруға болады. Және де XML-RPC көмегімен нақты бағдарламалау тілінен, жалпыға белгілі мәліметтер түрін (жолдар, сандар, логикалық мәндер және т.б.) қолдану есебінен, дерексіздіндірілуге болады. Python тілінде қашықтықтағы функцияларды шақыру синтаксисі бойынша қарапайым функцияларды шақырудан еш айырмашылығы жоқ:
import xmlrpclib
# байланысты орнату
req = xmlrpclib.ServerProxy("http://localhost:8000")
try:
# қашықтықтағы функцияны шақыру
print req.add(1, 3)
except xmlrpclib.Error, v:
print "ERROR",
Ал төменде XML-RPC-серверінің көрсетілімі (жоғарыда келтірілге мысалды көру үшін, ең алдымен серверді іске қосу қажет):
from SimpleXMLRPCServer import SimpleXMLRPCServer
srv = SimpleXMLRPCServer(("localhost", 8000)) # серверді іске қосу
srv.register_function(pow) # функцияны тіркеу
srv.register_function(lambda x,y: x+y, 'add') # және тағыда біреуін
srv.serve_forever() # сұрауларға қызмет ету
XML-RPC (ал бұл хаттама осы секілді хатамаларға қарағанда жеткілікті түрде “жеңіл”) көмегімен қосымша жалпы қабылданған түрлерінің негізгі параметрімен берілген функцияларды шақыру және дәл сондай қайтарылатын мәндермен бір-бірімен өздеріне түсінікті тілде сөйлесе алады.
Назар аударыңыз!
Әлбетте, бұл тек мысал ғана. Шынайы қолданыста XML-RPC сервер қауіпсіздік шарттарын сақтауын қадағалау керек. Сонымен қатар, сервер бірнеше ағынды бір мезгілде өңдеу үшін, оны көпағынды етіп қою керек. Көпағынды үшін (ол бөлек дәрісте талқыланатын болады) көбін қайта жасау керек емес: өз классын анықтау жеткілікті, айталық, ThreadingXMLRPCServer, SocketServer.TCPServer орнына SocketServer.ThreadingTCPServer қолдану. Бұл жаттығу ретінде ұсынылады. Туындайтын сұрақ: SimpleXMLRPCServer класының сипатталуы қайда орналасқан?
Орытынды
Бұл дәрісте практикалық мысалдарда және құжаттамадағы мәліметтерде интернетте жұмыс істеу үшін стандартты Python беретін мүмкіндіктер көрсетілген. Сценариден Python-ға сокеттер деңгейіндегі байланыстарды басқаруға болады, сонымен қатар нақты желілік хаттама үшін немесе хаттамалар жиынтығы үшін модулдерді қолдануға болады. Сокеттермен жұмыс істеу үшін socket модулі қызмет етеді, жоғары деңгейлі хаттамалар үшін арналған модулдер мынадай аттарға ие smtplib, poplib, httplib және т.б. WWW жүйесімен жұмыс жасау үшін urllib, urllib2, urlparse модулдерін қолдануға болады. Аталған модулдер типтік қолдану тұрғысынан қаралды. Стандартты емес тапсырмаларды шешу үшін басқа көздерге жүгінген дұрыс: құжаттамаға, модулдердің бастапқы кодына, интернеттегі іздеуге. Бұл дәрісте жоғары деңгейлі хаттамаларды серверлік құрушы туралыда айтылды. Мысал ретінде XML-RPC хаттамасы үшін клиент-серверлік жұп келтірілді. Бұл хаттама HTTP негізінде құрылды, бірақ белгілі мақсаттарға қызмет етеді.
10-дәріс: Деректер қорымен жұмыс