- •Email пакеті
- •Хабарларды талдау. Message классы
- •Хабарлама қалыптастыру
- •Тақырыпша өрісін талдау
- •Import email.Header
- •Import sys
- •Атаулар кеңістігі
- •Import os
- •Cgi модулі
- •Өндіруші ортасы
- •Zope және оның обьектілі моделі
- •Smtplib модулі
- •Poplib модулі
- •Import urllib
- •Import urllib
- •Url талдау үшін функия
- •Urllib2 мүмкіндіктері
- •Import urllib2
- •Қорытынды
- •Обьект – байланыс
Өндіруші ортасы
Статикалық құжаттамалармен және CGI-сценарийлері орналасқан веб-серверге қарағанда, Ввб-қосымшаларын құру үшін одан да күрделі тәсілдер қолданылады. Тағайындалуына байланысты мұндай бағдарламалық жүйелер веб-қосымшалардың сервері, мазмұнды басқару жүйесі (CMS, Content Management System), веб-жарияланым және WWW-порталдарын құру үшін арналған тәсілдер жүйесі деп аталады. Сонымен қатар CMS-жүйесі веб-қосымшасы сияқты орындалуы мүмкін, ал порталдарды құру үшін арналған тәсілдер, CMS – жүйесі ішкі жүйе болып табылатын, веб-жарияланым жүйесіне негізделуі мүмкін. Сондықтан нақты қажеттіліктер үшін жүйені таңдау кезінде, ол қандай функцияны орындайтынын нақтылап алу қажет.
Pyton тілі жеткілікті түрде бірнеше танымал қосымшаларына ие. Веб-қосымшаларының серверін құру үшін ең танымалы Zope болып табылады (см.
http://zope.org) (Z Object Publishing Environment, обьектілерді жариялау ортасы среда). Zope кірістірілген веб-серверіне ие, бірақ басқа веб-серверменде жұмыс істей алады, мысалы, Apache. Zope негізінде веб-порталын құруға болады, мысалы, Plone/Zope көмегі арқылы, бірақ өзіңіздің веб-қосымшаларыңызды дамытуға болады. Сонымен қатар Zope форманы, мазмұнын, логикасын бөлуге мүмкіндік береді, яғни мазмұнмен жеке адамдар (мазмұн бойынша менеджерлер), формамен-басқалары(веб-дизайнерлер), ал логикамен-үшіншілері (бағдарламаушылар). Zope жағдайында логиканы Python тілі көмегімен беруге болады, Форма графикалық немесе мамандандырылған веб-редакторларындар құрылуы мүмкін, ал мазмұнымен жұмыс Zope-тің өзінің веб-формасы арқылы орындалады.
Zope және оның обьектілі моделі
Zope мынадай мүмкіндіктерді қамтиды:
Веб-сервер. Zope веб-серверлермен CGI арқылы жұмыс істей алады немесе өзінің кірістірілген веб-серверін (ZServer) қолдану арқылы.
Өндіруші ортасы веб-қосымша сияқты орындалған. Zope веб-интерфейс арқылы веб-қосымшаларын құруға мүмкіндік береді.
Сценарилерді қолдау. Zope бірнеше сценарий тілдерін қолдайды: Python, Perl және өзінің DTML (Document Template Markup Language, құжат шаблонын таңбалау тілі).
Обьектілірдің деректер қоры. Zope өз жұмысында арнайы деректер қорында сақталатын (ZODB) тұрақты обьектілерді қолданады. Осы деректер қорын басқару үшін қарапайым интерфейс бар.
Реляциялық деректер қорымен бірігу. Zope өз обьектілерін және басқа мәліметтерді реляциялық ДҚБЖ-нде сақтай алады: Oracle, PostgreSQL, MySQL, Sybase және т.б.
Zope өндірушілері WWW негізінеде жатқан обьектілік моделден шықты, URI бойынша құжаттарды жүктемелеуді обьектіген жіберілген хабармен салыстыруға болатын. Zope обьектілері, қандайда бір рөлі бар, қолданушылар үшін саясатты қолжетімділікке тәуелді, папкалар (folders) бойынша ажыратылған. Обьект ретінде құжаттар, суреттер, мультимедиа-файлдары, деректер қоры адаптерлері және т.б.
Zope құжаттарын DTML тілінде жазуға болады – HTML синтаксисімен толықтыру, SSI (Server-Side Include) сияқты мәндерді қосу үшін. Мысалы, айнымалыны құжат атымен қою үшін қолдануға болады:
<!- #var document_title ->
Ескере кететіні, Zope обьектілері өздерінің атрибуттары, және де көбінесе Python тілінде жазылған әдістері болады. Айнымалыларда қолданушылармен берілген мәндері сияқты, сонымен қатар басқа мәліметтер көздері (мысалы, деректер базасынан SELECT функциясын орындау арқылы) секілді шығуы мүмкін.
Қазіргі таңда Zope құжатын сипаттау үшін көбінесе, өз кезегінде TAL-ды пайдаланылатын, ZPT (Zope Page Templates, Zope бетінің шаблондары) қолданылады. Ол құжат шаблонымен сипатталған құжаттар элементін ауыстыруға, қайталауға немесе өткізіп жіберуге мүмкіндік береді. TAL тілінің “операторлары” TAL кеңістігі атындағы XML-атрибуттары болып табылады. Кеңістік аттары бүгінде келесі идентификатормен сипатталады:
xmlns:tal=”http://xml.zope.org/namespaces/tal”
TAL операторының аты және мәні болады (аттармен және атрибуттар мәнімен есептелінеді). Мәннің ішінде синтаксисі TALES (Template Attribute Language Expression Syntax, TAL мәнінің синтаксисі) тілімен сипатталған, TAL-мәні жазылған.
Осылайша, ZPT, TAL атрибуттарын түсіндіре отырып, мазмұн шаблондарын толтырады. Мысалы, Zope құжат атын қою үшін (тег TITLE), шаблон келесідей кодқа ие болады:
<title tal:content="here/title">Doc Title</title>
Айта кететіні, келтірілген код HTML кодына келе береді, яғни веб-дизайнер проекттің кез келген жұмыс уақытында HTML-редакторында шаблондарын өзгерте алады (tal кеңістік атауындағы белгісіз атирбуттарды сақтаған кезде ғана). Бұл мысалда here/title – TALES өрнегі болып табылады. Doc Title мәтіні веб-дизайнердің бағдаршысы қызметін атқарады және here/title өрнегінің мәнімен ауыстырылады, яғни Zope құжатының title қасиеті алынады.
Ескерту:
Zope-та обьекттер қасиетке ие. Қасиеттер жиынтығы обьект түріне байланысты, бірақ жеке тәртіп бойынша ұзартылуы мүмкін. Id қасиеті әр кезде бар, title қасиеті әдетте көрсетіледі. Неғұрлым күрделі мысал ретінде, шаблондар ішіндегі ұйымдар қайталауын қарастыруға болады (Zope-та бұл мысалды сынап көру үшін Page Template обьектін қосу керек):
<ul>
<li tal:define="s modules/string"
tal:repeat="el python:s.digits">
<a href="DUMMY"
tal:attributes="href string:/digit/$el"
tal:content="el">SELECTION</a>
</li>
</ul>
Бұл шаблон келесідей нәтижеге ие:
<ul>
<li><a href="/digit/0">0</a></li>
<li><a href="/digit/1">1</a></li>
<li><a href="/digit/2">2</a></li>
<li><a href="/digit/3">3</a></li>
<li><a href="/digit/4">4</a></li>
<li><a href="/digit/5">5</a></li>
<li><a href="/digit/6">6</a></li>
<li><a href="/digit/7">7</a></li>
<li><a href="/digit/8">8</a></li>
<li><a href="/digit/9">9</a></li>
</ul>
Бұнда екі негізгі сәтке назар аудару қажет:
Шаблонда Python өрнегін (бұл мысалда s айнымалысы Python модулі секілді анықталған )және string.digits жолында итерациялар өтетін el цикілінің айнымалы-санауышын қолдануға болады.
TAL көмегімен тек қана элемент мазмұнын ғана емес, сонымен қатар тег атрибутында (бұл мысалда href атрибуты қолданылған) беруге болады.
Толығырақ құжаттама бойынша білуге болады. Тек, итерация түрлі деректер көздері болатынын байқау керек: ағындағы папкалардың мазмұны, деректер базасынан, немесе, мысалда келтірілгендей, Python обьектісі бойынша.
Zope динамкалық веб-сайтты жобалауда, кодтың ең жоғарғы қайта пайдалануына жету үшін, "көбейткiштер"және "жақша" орналасуға мүмкіндік береді.
Объекттер арасында арақатынастарды құрастыруға бірегей тәсіл көмектеседі: (acquisition) алыну.
Кейбір обьектілер (құжат, сурет, сценарий, деректер қорына қосылу және т.б.) Example папкасында орналасқан болсын. Енді осы папкадаға обьектілер кез келген төменде жатқан папкалардағы аттары бойынша қолжетімді. Тіпті қауіпсіздік саясатыда түбіріне жақын терең орналасқан папкадан папкаға алынады. Алысу Zope-тың өте маңызды тұжырымдамасы болып табылады, Zope түсінбей сауатты қолдану қиын, және керісінше, оны, өңдеудегі обьектілерді қайта қолдана отырып, түсіну күшті және уақытты үнемдеуге мүмкіндік береді.
Ең қызықтысы, сондай-ақ параллель папкаларданда обьектілерді алмастыруға болады. Мысалы, Example папкасының жанында керекті обьект (оның атауы note) орналасқан Zigzag папкасы орналасқан болсын. Сонымен қатар Example папкасында бағдарламаушыға ішінде note шақырылатын index_html обьектісі қызықтырады. Қарапайым index_html обьектісіне жол URI бойынша мына сияқты http://zopeserver/Example/ болады. Ал егер Zigzag-тағы note (және Example папкасында ол жоқ) қолдану керек болса, онда URI: http://zopeserver/Zigzag/Example/ болады. Осылайша, Zope сілтеу жолы дәстүрлі жолдан ерекшеленеді, айталық, Unix-те: жолда осы папкалардан обьектілерді алмастыруға мүмкіндік беретін, параллельді папкалар арқылы “иректер” болуы мүмкін. Осылайша, бір немесе бірнеше тәуелсіз аспектілерді біріктіре отырып нақты бетті жасауға болады.
Қорытынды
Бұл дәрісте веб-қосымшаларында Python-ды қолданудың түрлі көзқарастары қарастырылды. Веб-қосымшаларын жүзеге асырудың ең қарапайым жолы - CGI-сценарийін қолдану. Күрделірегі болып веб-сервер үшін арнайы модулдерді қолдану болып табылады. Соңында, веб-қосымшаларын құруға мүмкіндік беретін мамандандырылған сервистерін ұсынатын Zope секілді технологиялар бар.
9-дәріс Python-дағы желілік қосымшалар
Сокеталармен жұмыс
IP-желілерде қолданылатын клиент-сервер архитектурасы IP-пакеттерді клиенттер мен сервер арасындағы байланыс үшін пайдаланылады. Клиент серверге сұрау жібереді, ол жауап береді. TCP/IP жағдайында клиент және сервер арасында байланыс орнатылады (әдетте екі жақты мәліметтерді жіберумен), ал UDP/IP жағдайында – клиент және сервер кепілді емес пакеттермен (дейтаграммалармен) алмасады.
Әрбір IP-желілеріндегі желілік интерфейс осы желіде бірегей адресі ( IP-адрес) бар. Ықшамдап айтқанда Интернет желісіндегі әр компьютерде өзінің IP-адресі болады. Сонымен қатар бір желілік интерфейсте бірнеше желілік порттар болуы мүмкін. Клиент қосымшасына желілік байланыс орнату үшін бос портты таңдау және өшірілген желілік интерфейсте анықталған нөмерлер портын тындайтын (listen) серверлік қосымшамен байланысын орнату керек. IP-адрес жұбы және порт сокет (ұя) –желілік байланыстың бастапқы (соңғы) нүктесін сипаттайды. TCP/IP байланысын құру үшін екі сокет керек: бірі жергілікті машинаға, ал басқасы – өшірілгенге. Осылайша, әрбір желілік байланыстың IP-адресі және жергілікті машинадағы порты, сонымен қатар IP-адресі және өшірілген машинадағы порты бар.
Socket модулі Python-дағы сокеттермен жұмыс істеу мүмкіндігін қамтамасыз етеді.
OSI моделінің деңгейлері:
Физикалық
Физикалық желі арқылы жіберілетін биттер ағыны. Физикалық желілердің параметрлерін анықтайды.
Арналық (Ethernet, PPP, ATM және т.б.)
Физикалық біртұтас желі шегіндегі, физикалық деңгейде туындаған қателіктерді жеңе отыра, ағын биттері түріндегі мәліметтерді кодтайды және декодтайды.
Желілік (IP)
Ақпараттандырылған пакеттерді түйіннен түйінге маршруттайды.
Транспорттық (TCP, UDP және т.б.)
Екі байланыс нүктелері арасындағы деректердің көрінбей жіберілуін қамтамасыз етеді.
Сеанстық
Желілік қатысушылар арасында сеанстық байланыстарды басқарады. Байланысты бастайды, координаттайды және аяқтайды.о
Ұсыну (Представления)
Мәліметтердің формалардан тәуелсіздігін қамтамасыз етіп, оларды қайта құру форматы жолымен ұсыну.
Қосымшалар (HTTP, FTP, SMTP, NNTP, POP3, IMAP және т.б.)
Нақты желілік қосымшаларды қолдайды. Хаттама сервер түріне байланысты.
Әрбір сокет коммуникациялық домендерінің біріне жатады. Socket модулі UNIX және Internet домендерін қолдайды. Әр домен өз хаттамаларының және адресацияларының мүшесін білдіреді. Бұл баяндау тек Internet доменін қозғайды, ал дәлірек айтсақ TCP/IP и UDP/IP хаттамалары, сондықтан сокетті құру кезіндегі біріктіретін доменге сілтеу үшін socket.AF_INET тұрақтысы көрсетіледі.
Мысал ретінде қарапайым клиент-серверлік жұбын қарастыру керек. Сервер жолдарды қабылдайды және клиенттерге жауап береді. Желілік құрылғыны кейде хост (host) деп атайды, сондықтан бұл термин, желілік қосымша жұмыс істейтін, компьютермен байланыс кезінде қолданылады.
Сервер:
import socket, string
def do_something(x):
lst = map(None, x);
lst.reverse();
return string.join(lst, "")
HOST = "" # localhost
PORT = 33333
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind((HOST, PORT))
while 1:
print " Порт, тыңдап тұрмын 33333"
srv.listen(1)
sock, addr = srv.accept()
while 1:
pal = sock.recv(1024)
if not pal:
break
print "алынды %s:%s:" % addr, pal
lap = do_something(pal)
print "жіберілді %s:%s:" % addr, lap
sock.send(lap)
sock.close()
Клиент:
import socket
HOST = "" # қашықтықтағы компьютер (localhost)
PORT = 33333 # қашықтықтағы компьютердегі порт
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.send("ПАЛИНДРОМ")
result = sock.recv(1024)
sock.close()
print "Алынды:", result
Ескерту:
Мысалда орыс әріптері жазылған: кодтауды көрсету қажет.
Ең алдымен, серверді жіберу қажет. Сервер локальді машинаға 33333портына және 127.0.0.1 адресіне сокет ашады. Содан кейін ол портты тыңдайды (listen()). Портта мәліметтер шыққан кезде, кіріс байланысы (accept()) қолданылады. accept() әдісі, байланыс орнатылып жатқан (Ip-адрес жұбы, қашықтықтағы машинада орналасқан порт), Socket-объектісі және қашықтықтағы компьютердің адресінің жұптарын қайтарады. Осыдан кейін клиенттермен тілдесу үшін recv() және send() әдістерін қолдануға болады. recv()-те кезекті бөлікте байттар саны беріледі. Клиенттен саны аз мәліметтер келуі мүмкін.
Клиенттің бағдарлама коды жеткілікті түрде айқын. connect() әдісі қашықтықтағы хостпен байланыс орнатады (келтірілген мысалда ол сол машинада орналасқан). Мәліметтер send() әдісімен жіберіледі және ,серверде болып жатқандармен ұқсас, recv() әдісімен алынады.
Socket модулі бірнеше қосымшаларға ие. Атап айтқанда, домендік аттар жүйесімен (DNS) жұмыс істеу үшін функциялар:
>>> import socket
>>> socket.gethostbyaddr('www.onego.ru')
('www.onego.ru', [], ['195.161.136.4'])
>>> socket.gethostbyaddr('195.161.136.4')
('www.onego.ru', [], ['195.161.136.4'])
>>> socket.gethostname()
'rnd.onego.ru'
Python жаңа нұсқасында socket.getservbyname() функциясы пайда болды. Ол Интернет-сервис аттарын көпшілік мақұлдаған порт нөмірлеріне өзгертуге мүмкіндік береді:
>>> for srv in 'http', 'ftp', 'imap', 'pop3', 'smtp':
... print socket.getservbyname(srv, 'tcp'), srv
...
80 http
21 ftp
143 imap
110 pop3
25 smtp
Сонымен қатар модуль хаттамаларды, сокет түрін, біріктірілген домендерді,және т.б. көрсету үшін көп мөлшердегі тұрақтылардан тұрады. Socket модулінің басқа функцияларын құжаттама бойынша оқу қажеттілігінде мүмкін.
