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-дріс: Деректер орымен жмыс