- •Email пакеті
- •Хабарларды талдау. Message классы
- •Хабарлама қалыптастыру
- •Тақырыпша өрісін талдау
- •Атаулар кеңістігі
- •Cgi модулі
- •Өндіруші ортасы
- •Zope және оның обьектілі моделі
- •Smtplib модулі
- •Poplib модулі
- •Url талдау үшін функия
- •Urllib2 мүмкіндіктері
- •Қорытынды
- •Обьект – байланыс
- •Объект-курсор
- •Обьектер-түрлері
- •Python – қосымшаларындағы деректер қоырмен жұмыс істеу
- •Деректер қорын толтыру
- •Деректер қорынан таңдау
- •Ескерту:
- •Қорытынды
- •11 Дәріс: Көп ағынды есептеулер
- •Көп ағынды бағдарлама мысалы
- •Threading модулінің функциясы
- •Thread классы
- •Қай кезде құлыпталу қажет?
Cgi модулі
Python-да cgi модулі түріндегі CGI қолдауы бар. Келесі мысал оның кейбір мүмкіндіктерін көрсетеді:
#!/usr/bin/python
# -*- coding: cp1251 -*-
import cgi, os
# сұрауды талдау
f = cgi.FieldStorage()
if f.has_key("a"):
a = f["a"].value
else:
a = "0"
# сұрауды өңдеу
b = str(int(a)+1)
mytext = open(os.environ["SCRIPT_FILENAME"]).read()
mytext_html = cgi.escape(mytext)
# жауапты қалыптастыру
print """Content-Type: text/html
<html><head><title>Мысалдың шешімі: %(b)s = %(a)s + 1</title></head>
<body>
%(b)s
<table width="80%%"><tr><td>
<form action="me.cgi" method="GET">
<input type="text" name="a" value="0" size="6">
<input type="submit" name="b" value="Өңдеу">
</form></td></tr></table>
<pre>
%(mytext_html)s
</pre>
</body></html>""" % vars()
Бұл мысалда берілген сандар формасына 1 қосылады. Сонымен қатар өз сценарийінің бастапқы коды шығарылады. Атап өту қажет, >, <, & символдарын экрандау үшін cgi.escape() функиясы қолданылған. Веб-беттерді қалыптастыру үшін пішімдеу операциясы қолданылған. Сөздік ретінде ауыстыруды орындау үшін, барлық жергілікті айнымалыларымен берілген vars() сөздігі қолданылған. Олар пішімдеу командасымен түсіндірілмес үшін, пайыз белгілерін екі еселеуге тура келді. Мән қолданушыдан қалай алынғанына назар аудару қажет. FieldStorage обьектісі сөздікке жуық, сол ерекшелікпен, әдеттегі мәнді алу үшін value атрибутын қосымша қарап шығу керек. Іс мәнісінде, сценарийге тек мәтіндік мәндер ғана емес, сонымен қатар файлдарда жібіріле алады, сондай-ақ бір және сол атпен берілген көптеген мәндерде.
Абайлаңыз!
CGI-сценарийінің кіріс мәндерін өңдеу кезінде мұқият болу керек және рұқсат етілген мәндерді мұқият тексеру керек. Клиент кіруге не болсада жібере алады деп санау керек. Осылардың ішінен таңдау керек және сценарий күтіп отырғанды ғана тексеру керек. Мысалы, қолданушыдан алынған мәліметтерді, файл жолына eval() функциясының аргументтері және оған ұқсас; командалық жолдың параметрлерін; деректер қорына SQL-сұрауларының бөліктері ретінде қоюдың қажеті жоқ. Сондай-ақ, алынған мәліметтерді тікелей қалыптастырылатын беттерге қоюдың қажеті жоқ, егер осы беттер URL-тапсырыс беруші клиенттерді ғана емес көретін болса, тіпті осы мәліметтің жалғыз оқырманы-сайт администраторы болған жағдайда да.
Жоғарыда келтірілген мысалда қабылдауға тексеру int() функциясын шақыру кезінде жүзеге асты: егер сандық емес мән берілген болса, сценарий апатты түрде аяқталушы еді, ал қолданушы Internal Server Error көрер еді.
Кіріс мәліметтерін талдаудан кейін олардың өңдеу фазаларын белгілеуге болады. CGI-сценарийінің бұл бөлігінде одан әрі шығару үшін айнымалылар есептеледі. Бұнда жіберілген айнымалылардың мәнін ғана емес, сондай-ақ олардың болуы немесе болмауы қақ екенін ескеру қажет, өйткені бұлда сценарий логикасына әсер етуі мүмкін.
Әйтеуір, дайын обьектінің (мәтіннің, HTML-құжатының, суреттің, обьект-мультимедиасының және т.б.) шығару фазасы. Оңайы, беттер шаблонын алдын ала дайындап қою (немесе оның ірі бөліктерін), содан соң айнымалылар мазмұнымен толтыру оңай.
Келтірілген мысалда аттар сұрау жолында тек бір рет шығып тұрды. Кейбір формалар бір ат үшін бірнеше мәндерді тудырады. Барлық мәндерді getlist() әдісі көмегімен алуға болады.
lst = form.getlist("fld")
lst тізімі веб-формасынан алынған fld атымен берілген қанша өріс болса, сонша мәндерді қамтитын болады (ол бос болуыда мүмкін, егер ешбір өріс берілген атпен толтырылмаса).
Кейбір жағдайларда серверге файлдарды жіберу қажет (upload-істеу). Келесі мысал және оған келтірілген пікер бұл тапсырмамен түсінуге көмектеседі.
#!/usr/bin/env python
import cgi
form = cgi.FieldStorage()
file_contents = ""
if form.has_key("filename"):
fileitem = form["filename"]
if fileitem.file:
file_contents = """<P>Содержимое переданного файла:
<PRE>%s</PRE>""" % fileitem.file.read()
print """Content-Type: text/html
<HTML><HEAD><TITLE>Загрузка файла</TITLE></HEAD>
<BODY><H1>Загрузка файла</H1>
<P><FORM ENCTYPE="multipart/form-data"
ACTION="getfile.cgi" METHOD="POST">
<br>Файл: <INPUT TYPE="file" NAME="filename">
<br><INPUT TYPE="submit" NAME="button" VALUE="Передать файл">
</FORM>
%s
</BODY></HTML>""" % file_contents
Басында сценарийдің соңында келтірілген веб-форманы қарастыру керек: дәл сол CGI-сценарийі бойынша үнделген қолданушыға шығарылады. Форма веб-браузерде "Browse" түймесімен жолақты жазумен ұсынылатын, file түр өрісіне ие. "Browse" түймесін баса отыра қолданушы, қолданушының компьтерінде ОЖ-де қолжетімді, файлды таңдайды. Содан кейін, файлдарды серверге жіберу үшін, ол “Файылды жіберу” түймесін баса алады.
CGI-сценарийінің жөндеу үшін cgitb модулін қолдануға болады. Қателіктер туындаған кезде бұл модуль қателік орнын көрсете отыра, қызарған HTML-бетін шығарады. Жөнге келген сценарийдің басына қою керек
import cgitb
cgitb.enable(1)
Немесе, егер браузерде қателіктерді көрсету керек емес болса:
import cgitb
cgitb.enable(0, logdir="/tmp")
Тек есте сақтайтыны, сценарий жөнге келтірілсе, бұл жолдарды алып тастау керек, өйткені ол сценарий кодының бөліктерін шығарады. Бұл зиянкестермен, CGI-сценарийлерінің осал тұстарын тауып немесе құпия сөздерді көрумен , пайдаланылуы мүмкін.
CGI-дан кейін не?
Өкінішке орай, интерактивті құрылысы және CGI негізіндегі қатысқан сайттың өзінің шектеулері болады, негізінен өндірушімен байланысқан. Өйткені әр сұрау үшін шамамен бір сценарийді шақыру керек (ал ол дегеніміз - Python интерпретаторын жіберу) одан, мүмкін, деректер қорымен байланыс орнатуын істеу және т.б. Python интерпретаторының жіберу уақыты онша ірі емес, соған қарамастан бос емес серверде ол процессордың жүктемесіне үлкен әсер беруі мүмкін.
Интерпретатор жедел жадыда орналасқан, және деректер қорымен байланыс қолжетімділігі болуы керек.
Мұндай технологиялар бар және әдетте, веб-сервер-де құрамалы, модулдерге сүйенеді.
CGI жұмысын жеделжету үшін әртүрлі сызбалар қолданылады, мысалы FastCGI немесе PCGI (Persistent CGI). Осы дәрісте mod_python деп аталатын Apache web-сервері үшін арнайы модул қарастырылады.
Модуль құжаттамада берілген нұсқаулықтарға сәйкес, веб-серверде орнатылған болсын.
mod_python модулі сценарий-өңдіргішіне Apache серверімен HTTP-сұрауының кез келген сатысында өңдеу үдерісне кірістіруге мүмкіндік береді, сценарий қандайда бір жолмен функция аты болуы тиіс.
Ең алдымен, сценарий-өңдеуші жұмыс істейтін каталогты белгілеп алу керек. Бұл каталог /var/www/html/mywebdir болсын. Веб-сервер, бұл каталогте mod_python пайдалану керек екенін білу үшін, Apache файл конфигурациясына келесі жолды енгізу керек:
<Directory "/var/www/html/mywebdir>
AddHandler python-program .py
PythonHandler mprocess
</Directory>
Осыдан кейін веб-серверді қайта жіберу қажет, егер бәрі қатесіз шықса, mprocess.py өңдегішін жаза бастауға болады. Бұл сценарий кез келген http://localhost/*.py түріндегі сұрауларға жауап береді.
Келесі mprocess.py сценарийі браузер бетіне Hello, world! Сөзін шығарады:
from mod_python import apache
def handler(req):
req.content_type = "text/html"
req.send_http_header()
req.write("""<HTML><HEAD><TITLE>Hello, world!</TITLE></HEAD>
<BODY>Hello, world!</BODY></HTML>""")
return apache.OK
CGI-сценарийінен сценарий – өңдеушінің айырмашылығы:
Сценарий – өңдеуші әр HTTP-сұрауында іске қосылмайды: ол жадыда орналасқан, және одан керекті функция-өңдеушілері шақырылады (келтірілген мысалда бұндай функция жалғыз- handler()). Әр веб-сервердің үдеріс-тұқымы (процесс-потомок) өзінің сценарий көшірмесіне және Python интерпретаторына ие.
Соның нәтижесінде п.1 әртүрлі HTTP-сұраулары біодей жаһандық айнымалыларды бөледі. Мысалы, осылайша деректер қорымен байланыстарды баптауға және оны барлық сұрауларда қолдануға болады.
Өңдеуші ру кеңейтілуімен берілген кез келген файл кезінде іске қосылады, ал CGI-сценарийі әдетте нақты атау кезінде іске қосылады.
Өңдіруші сценарийлерді бірдей каталогте орналасқан модулдерді көреді деп есептеуге болмайды. sys.path-ке кейбір каталогтарды енгізу қажет болуы мүмкін.
Ағымдағы жұмыс каталогіде ( оны os.getcwd() функциясы көмегімен білуге болады ) өңдірушімен бірдей каталогте орналаспаған.
#!-жолы сценарийдің бірінші жолында Python интерпретаторының нұсқасын анықтамайды. mod_python-ге құрастырылған нұсқасы жұмыс істейді.
Барлық қажетті параметрлер Request-объект түріндегі өңдірушіге жіберіледі. Қайтарылатын мәндерде осы обьект арқылы жіберіледі.
Веб-сервер өңдеуші сценарийдің өзгергенін байқайды, бірақ оған импортталатын модульдердегі өзгерісті байқамай да. touch mprocess.py командасы сценарий файылының өзгерген күнін жаңартады.
os.environ көрінісі өңдірушіде қиылған болуы мүмкін. Сонымен қатар, өңдеуші сценарийіндегі шақырылған басқа бағдарламалар оны мұраланбайды. Айнымалыларды басқа жолмен алуға болады: req.add_common_vars(); params = req.subprocess_env.
Өңдіруші сценарийі “бір рет пайдаланатын” болып табылмағандықтан, CGI-сценарийі сияқты, бағдарлама қателігі кезінде жадының азаюы (бағдарлама керек емес жадыны босатпайды) болуы мүмкін. MaxRequestsPerChild параметірінің (бір үдеріс-тұқымымен өңделген, сұраудың максималды санын) мәнін нөлден артық орнату қажет.
Тағы бір мүмкін өңдіргіш сценарийнің идентификациясы:
def authenhandler(req):
password = req.get_basic_auth_pw()
user = req.connection.user
if user == "user1" and password == "secret":
return apache.OK
else:
return apache.HTTP_UNAUTHORIZED
Бұл функцияны ,алдында қарастырылған, mprocess.py модуліне қосу керек. Сонымен қатар, идентификация сұрауы (PythonAuthenHandler) үшін өңдірушіні тағайындай отыра, конфигурацияны толықтыру қажет, сондай-ақ, әдеттегі Apache үшін AuthType,AuthName, require директивалары, авторизация тәсілін анықтайтын:
<Directory "/var/www/html/mywebdir>
AddHandler python-program .py
PythonHandler mprocess
PythonAuthenHandler mprocess
AuthType Basic
AuthName "My page"
require valid-user
</Directory>
Әрине, бұл тек мысал ғана. Шын мәнінде идентификация қиынырақ берілуі мүмкін.
Басқа мүмкін құрастырулар (к mod_python-қа құжаттама бойынша, қандай өңдеуші сұраныстарда шақырылатынын білуге болады):
PythonPostReadRequestHandler
Алынған сұраныстың оның алынғаннан кейінгі өңделуі.
PythonTransHandler
URI сұранысын өзгертуге мүмкіндік береді (соның ішінде виртуальды желінің атын).
PythonHeaderParserHandler
Сұраулар өрісін өңдеу.
PythonAccessHandler
Шектелген қолжетілімдікті өңдеу (мысалы, IP-адрестері бойынша).
PythonAuthenHandler
Қолданушы идентификациясы.
PythonTypeHandler
Құжат түрінің, тілдің және т.б. анықталуы және/немесе настройкасы.
PythonFixupHandler
Өңдегіші мазмұнын шақырар алдында тікелей өрістерді өзгерту.
PythonHandler
Сұрау өндіргішінің негізінде.
PythonInitHandler
PythonPostReadRequestHandler немесе PythonHeaderParserHandler байланысты веб-сервер конфигурациясын табу.
PythonLogHandler
Журналындағы жазуды басқару.
PythonCleanupHandler
Request-объектісін жою алдында тікелей шақырылатын өңдеуші.
Кейбір осы өңдірушілер тек жаһанды түрде жұмыс істейді, себебі шақырылу кезінде олардың қосымша каталогіде белгісіз болуы мүмкін ( мынадай, мысалы PythonPostReadRequestHandler).
mod_python көмегімен динамикалық мазмұнмен берілген веб-сайттарды құруға болады және Python-сценарии арқылы кейбір веб-серверлердің жұмыс істеу аспектісін бақылауға болады.
