Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
104-155.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
122.82 Кб
Скачать

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-сценарийінен сценарий – өңдеушінің айырмашылығы:

  1. Сценарий – өңдеуші әр HTTP-сұрауында іске қосылмайды: ол жадыда орналасқан, және одан керекті функция-өңдеушілері шақырылады (келтірілген мысалда бұндай функция жалғыз- handler()). Әр веб-сервердің үдеріс-тұқымы (процесс-потомок) өзінің сценарий көшірмесіне және Python интерпретаторына ие.

  2. Соның нәтижесінде п.1 әртүрлі HTTP-сұраулары біодей жаһандық айнымалыларды бөледі. Мысалы, осылайша деректер қорымен байланыстарды баптауға және оны барлық сұрауларда қолдануға болады.

  3. Өңдеуші ру кеңейтілуімен берілген кез келген файл кезінде іске қосылады, ал CGI-сценарийі әдетте нақты атау кезінде іске қосылады.

  4. Өңдіруші сценарийлерді бірдей каталогте орналасқан модулдерді көреді деп есептеуге болмайды. sys.path-ке кейбір каталогтарды енгізу қажет болуы мүмкін.

  5. Ағымдағы жұмыс каталогіде ( оны os.getcwd() функциясы көмегімен білуге болады ) өңдірушімен бірдей каталогте орналаспаған.

  6. #!-жолы сценарийдің бірінші жолында Python интерпретаторының нұсқасын анықтамайды. mod_python-ге құрастырылған нұсқасы жұмыс істейді.

  7. Барлық қажетті параметрлер Request-объект түріндегі өңдірушіге жіберіледі. Қайтарылатын мәндерде осы обьект арқылы жіберіледі.

  8. Веб-сервер өңдеуші сценарийдің өзгергенін байқайды, бірақ оған импортталатын модульдердегі өзгерісті байқамай да. touch mprocess.py командасы сценарий файылының өзгерген күнін жаңартады.

  9. os.environ көрінісі өңдірушіде қиылған болуы мүмкін. Сонымен қатар, өңдеуші сценарийіндегі шақырылған басқа бағдарламалар оны мұраланбайды. Айнымалыларды басқа жолмен алуға болады: req.add_common_vars(); params = req.subprocess_env.

  10. Өңдіруші сценарийі “бір рет пайдаланатын” болып табылмағандықтан, 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-сценарии арқылы кейбір веб-серверлердің жұмыс істеу аспектісін бақылауға болады.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]