Дріс: Web-осымшаларын зірлеу

Web-осымшалары арылы HTML жне XML жаттарыны басаруындаы стандартты www-браузерімен жмыс істейтін негізгі пайдаланушы интерфейсіні бадарламасын тсінуге болады. олданушы интерфейсіні сапасын жасарту шін кбіне JavaScript олданылады, алайда бл интерфейс мбебаптылыын бірнеше тмендетеді. Ескере кететіні интерфейсті java немесе Flash-апплеттерінде руа болады, алайда бндай осымшаларды web-осымшалары деп атау иынды тудырады, йткені, сервермен байланысу шін java немесе Flash здеріні хаттамаларын олдана алады, яни HTTP хаттамасы WWW шін стандартты емес байланыс олданылады.

Web-осымшаларын ру кезінде Пішінін (сырты трін,стилін), Мазмнын жне Деректерді деу логикасын блуге тырысады. Web-сайттарды руды заманауи технологиялары бл идеала жеткілікті трде жетуге ммкіндік береді. Дегенмен, тіпті кп дегейлі осымшаларды олданбай-а баса екеуін тиіспейтін (немесе жуы тимей(не затрагивая)), бларды кез келген аспектін згертуге ммкіндік беретін стилін стануа болады. Бл таырыпты жаласын бадарламалау ортасына арналан блімде танысуа болады.

CGI-сценарилер

WWW шін осымшаларды руды классикалы жолы – CGI-сценарилерін жазу болып табылады (кейде – скриптер деп те аталады). CGI (Common Gateway Interface, жалпы шлюзді интерфейс) – бл сырты осымшалармен серверді зара рекеттесуін реттейтін стандарт. WWW жадайда, веб-сервер наты сценариге генерациялы бетті жасау шін срау жіберуі ммкін. Бл сценарий веб-серверден мліметтерді кірісін алып (ол з кезегінде оны олданушыдан алуы ммкін), дайын обьектіні жинатайды (сурет, аудио мліметтер, стилдер кестелері жне таы баса)

Сценарийді шаыран кезде веб-сервер стандартты енгізу арылы оан апаратты тасымалдайды, айнымалылар ортасы жне, ISINDEX шін прмен жолы аргументтері арылы (олар sys.argv арылы ол жетімді.).

Толтырылан браузердегі веб-сервер формасыны (жне CGI-сценарий) екі негізгі мліметтерді жіберуді дістері – GET жне POST. діске байланысты мліметтер р трлі жіберіледі. Бірінші жадайда олар тікелей URL-ге кодталады жне орналастырылады, мысалы http://host/cgibin/a.cgi?a=1&b=3. Сценарий оларды QUERY_STRING айнымалы ортасыны атымен алады. POST дісі жадайында олар стандартты енгізуге жіберіледі.

Сценарийлер дрыс жмыс істеуі шін осы каталог шін арналан веб-серверде (детте ол cgi-bin деп аталады) немесе, егер бл сервер конфигурациясымен рсат етілген болса, HTML жатыны кез келген жерінде орналасады. Сценарийді орындалатын белгісі болуы тиіс. Unix жйесінде оны chmod a+x командасы арылы орнатуа болады.

Келесі арапайым сценарий os.environ сздігінен мнін шыарады жне оан не жіберілгенін круге ммкіндік береді.

#!/usr/bin/python

import os

print """Content-Type: text/plain

%s""" % os.environ

Оны кмегімен веб-сервермен орнатылан айнымалылар ортасын круге болады. web-серверге CGI-сценарий берілген файл таырыпша блімін амтиды, мнда мета-апаратпен берілген ріс крсетілген (мазмн трі, жатты соы жаартылан уаыты, кодтау жне т.б.).

Негізгі айнымалылар ортасы сценарийлер жасау шін жеткілікті:

QUERY_STRING

Срау жолы.

 

REMOTE_ADDR

Клиент IP-адресі.

 

REMOTE_USER

Клиент аты (егер ол табылан болса).

 

SCRIPT_NAME

Сценарий аты.

 

SCRIPT_FILENAME

Сценариймен берілген файл аты.

 

SERVER_NAME

Сервер аты.

 

HTTP_USER_AGENT

Браузер клиентіні атауы.

 

REQUEST_URI

(URI) жолдар срауы.

 

HTTP_USER_AGENT

Сервер аты.

 

HTTP_ACCEPT_LANGUAGE

ажетті жат тілі.

 

CGI-сценарийіндегі os.environ сздігі амтиды:

{

'DOCUMENT_ROOT': '/var/www/html',

'SERVER_ADDR': '127.0.0.1',

'SERVER_PORT': '80',

'GATEWAY_INTERFACE': 'CGI/1.1',

'HTTP_ACCEPT_LANGUAGE': 'en-us, en;q=0.50',

'REMOTE_ADDR': '127.0.0.1',

'SERVER_NAME': 'rnd.onego.ru',

'HTTP_CONNECTION': 'close',

'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; U; Linux i586; en-US;

rv:1.0.1) Gecko/20021003',

'HTTP_ACCEPT_CHARSET': 'ISO-8859-1, utf-8;q=0.66, *;q=0.66',

'HTTP_ACCEPT': 'text/xml,application/xml,application/xhtml+xml,

text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,

image/gif;q=0.2,text/css,*/*;q=0.1',

'REQUEST_URI': '/cgi-bin/test.py?a=1',

'PATH': '/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin',

'QUERY_STRING': 'a=1&b=2',

'SCRIPT_FILENAME': '/var/www/cgi-bin/test.py',

'HTTP_KEEP_ALIVE': '300',

'HTTP_HOST': 'localhost',

'REQUEST_METHOD': 'GET',

'SERVER_SIGNATURE': 'Apache/1.3.23 Server at rnd.onego.ru Port 80',

'SCRIPT_NAME': '/cgi-bin/test.py',

'SERVER_ADMIN': 'root@localhost',

'SERVER_SOFTWARE': 'Apache/1.3.23 (Unix) (Red-Hat/Linux)

mod_python/2.7.8 Python/1.5.2 PHP/4.1.2',

'SERVER_PROTOCOL': 'HTTP/1.0',

'REMOTE_PORT': '39251'

}

Келесі CGI-сценарийі ара шаршыны береді (суреттерді деу шін онда Image модулі олданылады):

#!/usr/bin/python

 

import sys

print """Content-Type: image/jpeg

"""

 

import Image

i = Image.new("RGB", (10,10))

i.im.draw_rectangle((0,0,10,10), 1)

i.save(sys.stdout, "jpeg")

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-сценарии арылы кейбір веб-серверлерді жмыс істеу аспектісін баылауа болады.

Ндіруші ортасы

Статикалы жаттамалармен жне 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-ті зіні веб-формасы арылы орындалады.