- •Email пакеті
- •Хабарларды талдау. Message классы
- •Хабарлама қалыптастыру
- •Тақырыпша өрісін талдау
- •Атаулар кеңістігі
- •Cgi модулі
- •Өндіруші ортасы
- •Zope және оның обьектілі моделі
- •Smtplib модулі
- •Poplib модулі
- •Url талдау үшін функия
- •Urllib2 мүмкіндіктері
- •Қорытынды
- •Обьект – байланыс
- •Объект-курсор
- •Обьектер-түрлері
- •Python – қосымшаларындағы деректер қоырмен жұмыс істеу
- •Деректер қорын толтыру
- •Деректер қорынан таңдау
- •Ескерту:
- •Қорытынды
- •11 Дәріс: Көп ағынды есептеулер
- •Көп ағынды бағдарлама мысалы
- •Threading модулінің функциясы
- •Thread классы
- •Қай кезде құлыпталу қажет?
Poplib модулі
Тағыда бір хаттама - POP3 (Post Office Protocol, почталық хаттама) – серверде почталық жәшіктен почта қабылдау үшін қызмет етеді (хаттама RFC 1725 анықталған).
Почталық сервермен жұмыс істеу үшін олармен байланыс орнату керек және, жоғарыда қаралған мысал тәрізді, SMTP-командасының көмегімен талап етілген хабарламаларды алу. POP3 байланыс обьектісімен poplib модуліндегі POP3 конструктор классы арқылы орнатуға болады:
poplib.POP3(host[, port])
Мұндағы host - POP3-серверінің адресі, port - сервердегі порт (үнсіз келісім бойынша 110), pop_obj- POP3-серверімен жұмыс сеансын басқару үшін обьекті.
Келесі мысал POP3-байланысымен жұмыс істеу үшін негізгі әдістерді көрсетеді.
import poplib, email
# Қолданушының есептiк деректерi:
SERVER = "pop.server.com"
USERNAME = "user"
USERPASSWORD = "secretword"
p = poplib.POP3(SERVER)
print p.getwelcome()
# бiрдейлендiрудiң кезеңi
print p.user(USERNAME)
print p.pass_(USERPASSWORD)
# транзакциялау кезеңі
response, lst, octets = p.list()
print response
for msgnum, msgsize in [i.split() for i in lst]:
print "Сообщение %(msgnum)s имеет длину %(msgsize)s" % vars()
print "UIDL =", p.uidl(int(msgnum)).split()[2]
if int(msgsize) > 32000:
(resp, lines, octets) = p.top(msgnum, 0)
else:
(resp, lines, octets) = p.retr(msgnum)
msgtxt = "\n".join(lines)+"\n\n"
msg = email.message_from_string(msgtxt)
print "* От: %(from)s\n* Кому: %(to)s\n* Тема: %(subject)s\n" % msg
# msg содержит заголовки сообщения или все сообщение (если оно небольшое)
# этап обновления
print p.quit()
Ескерту:
Әлбетте, мысал нақты істеу үшін нақты есептік деректерді енгізу керек.
Сценарий орындалу кезде экранға келесідей шығарады:
+OK POP3 pop.server.com server ready
+OK User name accepted, password please
+OK Mailbox open, 68 messages
+OK Mailbox scan listing follows
Сообщение 1 имеет длину 4202
UIDL = 4152a47e00000004
* От: online@kaspersky.com
* Кому: user@server.com
* Тема: KL Online Activation
...
+OK Sayonara
Осы және басқа POP3 классының көшірмелерінің әдістері төменде сипатталған:
Әдіс |
POP3 командасы |
сипатталуы |
getwelcome() |
|
POP3-сервері бойынша s жолын алады. |
user(name) |
USER name |
name қолданушы атымен көрсетілген USER командасын жібереді. |
pass_(pwd) |
PASS pwd |
PASS командасында қолданушы кілттік сөзін жібереді. Осы командадан кейін және QUIT командасының орындалуына дейін почталық жәшік бұғатталады. |
apop(user, secret) |
APOP user secret |
APOP бойынша серверде идентификациялау. |
rpop(user) |
RPOP user |
RPOP әдісі бойынша идентификациялау |
stat() |
STAT |
Пошта жәшiгi туралы ақпаратпен кортежді қайтарады. Мұндағы m – хабарлама саны, l – байт бойынша почта жәшігінің өлшемі. |
list([num]) |
LIST [num] |
(resp, ['num octets', ...]) форматтағы хабарлама тізімін қайтарады, егер num, и "+OK num octets" көрсетілмесе, егер көрсетілсе. |
retr(num) |
RETR num |
Серверден num нөмерімен берілген хабарламаны жүктейді және (resp, lst, octets) серверінің жауабымен берілген кортежді қайтарады |
dele(num) |
DELE num |
Num нөмерімен берілген хабарламаны өшіреді |
rset() |
RSET |
Хабарламаны өшіру белгілерін болдырмайды. |
noop() |
NOOP |
Ештене істемейді (байланысуды қолдайды) |
quit() |
QUIT |
Серверден өшірілу. Сервер барлық қажетті өзгертулерді орындайды (хабарламаны өшіреді) және почталық жәшіктің құлыптамасын шешеді. |
top(num, lines) |
TOP num lines |
Команда RETR-ге ұқсас, бірақ тек тақырыпшаны және хабарлама денесінің lines жолын жүктейді. Кортежді (resp, lst, octets) қайтарады. |
uidl([num]) |
UIDL [num] |
"unique-id listing"-тан қысқартылған (хабралама индификаторларының бірегей тізімі). Нәтиже форматы: (resp, lst, octets), егер num көрсетілмесе, және "+OK num uniqid", егер көрсетілсе. Lst тізімі "+OK num uniqid" түріндегі жолдардан тұрады. |
Бұл кестеде num хабарлама нөмерін білдіреді (ол барлық сессия аралығында өзгертілмейді), resp – сервер жауабы, кез келген команда үшін қайтарылады, нәтижелі операциялар үшін “+OK”-тан басталады (сәтсіздік кезінде poplib.proto_error ерекше жағдайы туындайды). Octets параметрі қабылданған мәліметтердің байттар санын білдіреді. uniqid – сервермен жинақталған хабарлама идентификаторы.
POP3-сервермен жұмыс үш кезеңнен тұрады: идентификация, транзакция және жаңарту. Идентификация кезеңінде, POP3-объектсін құрғаннан кейін бірден, тек USER, PASS (иногда APOP и RPOP) командалары рұқсат етілген. Идентификациядан кейін сервер қолданушы жайлы мәліметті алады және транзакция кезеңі басталады. Бұнда қалған командалар орналастырылған. Жаңарту кезеңі QUIT командасымен шақырылады, солан кейінгі POP3-сервер берілген командалармен қолданушының почталық жәшігін жаңартады, яғни хабарламаны өшіру үшін белгіленгендерді өшіреді.
WWW клиенттері үшін модулдер
Python тілінің стандартты құрылғылары бағдарламалардан WWW обьектісіне қарапайым жағдайдағыдай, сондай-ақ қиын жағдайлардада қолжетімділік алуға мүмкіндік береді, көбінесе формалардың мәліметтері, идентификация, прокси арқылы қолдетімділікті жіберу қажеттілігінде және т.б.
Ескере кететіні, WWW-пен жұмыс кезінде негізінен HTTP хаттамасы қолданылады, бірақ WWW тек қана HTTP-ді қамтымайды сондай-ақ басқа схемаладыда қамтиды (FTP, gopher, HTTPS және т.б.). Қолданылған схема әдетте URL ең басында көрсетілген.
Желілік обьектілерді жүктеудің функциялары
Белгілі URL бойынша WWW-объектісінің қарапайым жағдайы келесі мысалда көрсетілген.
import urllib
doc = urllib.urlopen("http://python.onego.ru").read()
print doc[:40]
urllib.urlopen() функциясы read() әдісімен оқитын, файлтәрізді обьект құрады. Осы обьектің басқа әдістері: readline(), readlines(), fileno(), close() әдеттегі файл бойынша жұмыс істейді, сондай-ақ Message-объект серверінен алынғанмен сәйкестерді қайтаратын info() әдісі бар. Бұл обьектіні қосымша мәлімет алу үшін қолдануға болады:
>>> import urllib
>>> f = urllib.urlopen("http://python.onego.ru")
>>> print f.info()
Date: Sat, 25 Dec 2004 19:46:11 GMT
Server: Apache/1.3.29 (Unix) PHP/4.3.10
Content-Type: text/html; charset=windows-1251
Content-Length: 4291
>>> print f.info()['Content-Type']
text/html; charset=windows-1251
urllib.urlopen() функциясы көмегімен күрделілек заттарды істеуге болады, мысалы, web-серверге форма мәлімметтерін жіберу. Белгілі болғандай, web-формалардың толтырылған мәліметтері web-серверге GET әдісін немесе POST әдісін қолдануымен жіберілуі мүмкін. GET әдісі URL-дегі "?" белгісінен кейін барлық жіберілген параметрлернің кодталуымен байланысты, ал POST әдісінің жағдайында мәліметтер HTTP-сұрауының денесінде жіберіледі. Жіберудің екі нұсқасы төменде келтірілген:
import urllib
data = {"search": "Python"}
enc_data = urllib.urlencode(data)
# метод GET
f = urllib.urlopen("http://searchengine.com/search" + "?" + enc_data)
print f.read()
# метод POST
f = urllib.urlopen("http://searchengine.com/search", enc_data)
print f.read()
Кейбір жағдайларда мәліметтер қайталаныатын аттарға ие. Бұл жағдайда urllib.urlencode() параметірі ретінде сөздік орнына ат-мән жұбының тізбектілігін қолдануға болады:
>>> import urllib
>>> data = [("n", "1"), ("n", "3"), ("n", "4"), ("button", "Привет"),]
>>> enc_data = urllib.urlencode(data)
>>> print enc_data
n=1&n=3&n=4&button=%F0%D2%C9%D7%C5%D4
urllib модулі прокси-сервер арқылы веб-обьектілерді жүктеуге мүмкіндік береді. Егер ештене көрсетпесек,нақты ОЖ тәсілі қабылдануымен берілген прокси-сервер қолданылады. Unix-те прокси-сервер http_proxy, ftp_proxy және т.б. айнымалы арасында беріледі. Windows-та прокси-серверлер реестрде жазылған, ал Mac OS-та олар Internet конфигурациясынан алынады. Прокси-серверді proxies к urllib.urlopen() атты параметр сияқты беруге болады.
# Использовать указанный прокси
proxies = proxies={'http': 'http://www.proxy.com:3128'}
f = urllib.urlopen(some_url, proxies=proxies)
# Не использовать прокси
f = urllib.urlopen(some_url, proxies={})
# Использовать прокси по умолчанию
f = urllib.urlopen(some_url, proxies=None)
f = urllib.urlopen(some_url)
urlretrieve() функциясы берілген URL желілік обьектісін файлда жазуға мүмкіндік береді. Ол келесідей параметрлерге ие:
urllib.urlretrieve(url[, filename[, reporthook[, data]]])
Мұндағы url-желілік обьектінің URL-і, filename- обьекті сыйдыру үшін локальды файл аты, reporthook- жүктеме күйі жайлы хабарлама үшін шақырылатын функия, data-POST ( егер ол қолданылса) әдісі үшін мәліметтер. Функция (filepath, headers) кортежді қайтарады, мұндағы filepath – локальды файл аты.
urllib.urlretrieve() функциясының интерактивтілігін қамтамасыз ету үшін reporthook() берілген функциясын уақыт өте келе шақырады. Бұл функцияда үш аргумент жіберіледі:қабылданған блоктар саны, өлшемі, блоктың және байттағы (бұл параметр -1-ге тең, егер ол белгілі болса) қабылданған жалпы өлшемі.
Келесі мысалда бағдарлама үлкен файл қабылдайды.
FILE = 'boost-1.31.0-9.src.rpm'
URL = 'http://download.fedora.redhat.com/pub/fedora/linux/core/3/SRPMS/' + FILE
def download(url, file):
import urllib, time
start_t = time.time()
def progress(bl, blsize, size):
dldsize = min(bl*blsize, size)
if size != -1:
p = float(dldsize) / size
try:
elapsed = time.time() - start_t
est_t = elapsed / p - elapsed
except:
est_t = 0
print "%6.2f %% %6.0f s %6.0f s %6i / %-6i bytes" % (
p*100, elapsed, est_t, dldsize, size)
else:
print "%6i / %-6i bytes" % (dldsize, size)
urllib.urlretrieve(URL, FILE, progress)
download(URL, FILE)
Бұл бағдарлама келесідей шығарады
0.00 % 1 s 0 s 0 / 6952309 bytes
0.12 % 5 s 3941 s 8192 / 6952309 bytes
0.24 % 7 s 3132 s 16384 / 6952309 bytes
0.35 % 10 s 2864 s 24576 / 6952309 bytes
0.47 % 12 s 2631 s 32768 / 6952309 bytes
0.59 % 15 s 2570 s 40960 / 6952309 bytes
0.71 % 18 s 2526 s 49152 / 6952309 bytes
0.82 % 20 s 2441 s 57344 / 6952309 bytes
