Web-қосымшаларды әзірлеу

Web-қосымшаларды әзірлеу.
Дәрістің мақсаты: Web-қосымшаларды әзірлеуді қарастыру.
Тақырып бойынша қарастырылатын сұрақтар:
1. CGI сценарийлері.
2. CGI модулі.

Www-браузерде HTML және XML-құжаттарды басқаратын негізгі интерфейсі жұмыс істейтін бағдарлама web-қосымша деп түсініледі. Сапасын жақсарту үшін пайдаланушы интерфейсінің жиі қолданады JavaScript, алайда бұл бірнеше төмендетеді әмбебаптығы интерфейс. Айта кету керек, интерфейс құруға болады Java — немесе Flash-апплетах, алайда, мұндай қосымшалар қиын деп атауға web-қосымшаларда, себебі Java немесе Flash пайдалана алады өз хаттамалар қарым-қатынас жасау үшін, сервер, ал стандартты емес үшін WWW хаттама HTTP.

Web-қосымшаларды құру кезінде пішін (сыртқы түрі, стилі), мазмұны мен деректерді өңдеу логикасын бөлуге тырысады. Web-сайттарды құрудың заманауи технологиялары осы идеалға өте жақын болуға мүмкіндік береді. Дегенмен, көп деңгейлі қосымшаларды қолданбай да, басқаларды қозғамай (немесе қозғамай), осы аспектілердің кез келгенін өзгертуге мүмкіндік беретін стильді ұстануға болады. Бұл тақырыпты талқылау әзірлеу ортасына арналған бөлімде жалғасатын болады.

1. CGI сценарийлері.
Www үшін қосымшаларды жасаудың классикалық жолы-CGI сценарийлерін жазу (кейде скрипттер айтады). CGI ( Common Gateway Interface, жалпы шлюздік интерфейс) — бұл сервердің сыртқы қосымшалармен өзара әрекеттесуін регламенттейтін стандарт. WWW болған жағдайда, web-сервер белгілі бір сценарий бойынша бетті генерациялау сұрауын жібере алады. Бұл сценарий web-серверден (сол, өз кезегінде, оларды пайдаланушыдан ала алады) кіріс деректерді алып, дайын нысанды (сурет, аудиодер, стильдер кестесі және т.б.) генерациялайды.

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

Web-серверге (және CGI-сценарийге) — GET және POST браузерде толтырылған формадан деректерді берудің екі негізгі әдісі. Әдісіне байланысты деректер әртүрлі беріледі. Бірінші жағдайда олар кодталады және тікелей URL-ге орналастырылады, мысалы: http://example.com/cgi-bin/a.cgi?a=1&b=3. Сценарий оларды QUERY_STRING атымен айнымалыға алады. POST әдісі жағдайында олар стандартты енгізуге беріледі.

Ол үшін, егер бұл сервердің конфигурациясы рұқсат етілсе, HTML құжаттары арасында кез-келген орында. Сценарий орындалуының белгісі болуы тиіс. Unix жүйесінде оны chmod a+x пәрменімен орнатуға болады.

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

#!/usr/bin/python

import os
print «»»Content-Type: text/plain

%s»»» % os.environ

Оның көмегімен Web-сервермен орнатылған орта айнымалыларын көруге болады. Web-сервердің CGI сценарийімен берілетін файл метаақпараттық өрістер (мазмұн түрі, құжаттың соңғы жаңартылу уақыты, кодтау және т.б .) көрсетілген тақырып бөлігін қамтиды.

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

QUERY_STRING
Сұраныс жолы.

REMOTE_ADDR
Клиенттің IP-мекенжайы.

REMOTE_USER
Клиенттің аты (егер ол сәйкестендірілсе).

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

SCRIPT_FILENAME
Сценарийі бар Файл атауы.

SERVER_NAME
Сервер аты.

HTTP_USER_AGENT
Клиент браузерінің атауы.

REQUEST_URI
Сұрау жолы (URI).

HTTP_ACCEPT_LANGUAGE
Құжаттың қажетті тілі.

Мұнда os сөздігі болуы мүмкін.environ CGI сценарийінде:
{
‘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»)


2. 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(). Web-бетті қалыптастыру үшін пішімдеу операциясы қолданылды. Сөздік ретінде барлық жергілікті айнымалылармен vars () сөздігі қолданылады. Пайыз белгілері пішімдеу командасымен түсіндірілмеуі үшін екі еселенді. Пайдаланушыдан мәні қалай алынғанына назар аудару керек. FieldStorage нысаны «дерлік» сөздік, әдеттегі мәнді алу үшін қосымша мән төлсипатын қарау керек. Сценарийге тек мәтіндік мәндерді ғана емес, сондай-ақ файлдарды да, сондай-ақ сол атауымен көпше мәндерді де бере алады.

Абайлаңыз!

CGI сценарийлердің кіріс мәндерін өңдегенде, рұқсат етілген мәндерді мұқият және мұқият тексеру қажет. Клиент кез келген нәрсені кіре алады деп санаған дұрыс. Осының барлығы сценарийді күтетін нәрсені таңдау және тексеру қажет.

Мысалы, пайдаланушыдан алынған деректерді eval() және оған ұқсас функцияларға аргументтер ретінде файл жолына; командалық жолдың параметрлері; деректер базасына SQL-сұранымындағы бөліктер ретінде қоюға болмайды. Сондай-ақ, егер бұл беттер тек URL мекен — жайына тапсырыс берген клиент ғана емес (мысалы, мұндай жағдай web-чаттарда, форумдарда, қонақ кітаптарында әдеттегі), және тіпті осы ақпараттың жалғыз оқырманы-сайт әкімшісі болған жағдайда да, алынған деректерді тікелей қалыптастырылатын беттерге енгізуге болмайды. HTML-коды тексерілмеген, пайдаланушыдан тікелей келіп түскен беттерді қарайтын адам өзінің браузерінде оны қорғауда пайдаланатын зиянды кодты өңдеу қаупі бар.

CGI сценарийін URL-ге сұрау арқылы басқа сценарийлер ғана пайдаланса да, пайдаланушы деректерді енгізгеннен кейін кіріс мәндерін мұқият тексеру қажет. (Өйткені теріс пайдаланушы web-серверге кез келген мәндерді бере алады).

Жоғарыда мысалда int () функциясын шақырған кезде рұқсат етілген тексеру жүргізілді: егер сансыз мән қойылса, сценарий авариялық аяқталды, ал Пайдаланушы Internal Server Error көрді.

Кіріс деректерін талдағаннан кейін оларды өңдеу фазасын бөліп көрсетуге болады. Бұл бөлімде CGI-сценарий одан әрі шығару үшін айнымалылар есептеледі. Бұл жерде берілген айнымалылардың мәндерін ғана емес, сонымен қатар олардың болу немесе болмау фактілерін де ескеру қажет, себебі бұл да сценарий логикасына әсер етуі мүмкін.

Және, соңында, дайын нысанды (мәтін, HTML-құжат, сурет, мультимедиа-объект және т.б.) шығару фазасы. Беттің үлгісін (немесе оның ірі бөліктерін) алдын ала дайындау оңай, содан кейін жай ғана айнымалылардан мазмұнды толтыру.

Келтірілген мысалдарда аттар сұраныс жолында тек бір рет пайда болды. Кейбір нысандар бір атау үшін бірнеше мәндерді тудырады. Барлық мәндерді getlist әдісі арқылы алуға болады():

lst = form.getlist(«fld»)

Lst тізімі fld аты бар өрістер web-формадан алынған ( берілген аты бар бірде- бір өріс толтырылмаған болса, ол бос болуы мүмкін) сияқты мәндерден тұрады .

Кейбір жағдайларда серверге файлдарды жіберу керек (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
Ең басында сценарий соңында келтірілген web-форманы қарастыру керек: ол CGI-сценарий бойынша жүгінген кезде пайдаланушыға шығарылады. Сонымен қатар, web-браузерде енгізу жолағы мен «Browse»батырмасы бар file түрінің өрісі бар. «Browse» батырмасын басу арқылы пайдаланушы компьютерде ОЖ қол жетімді файлды таңдайды. Осыдан кейін ол файлды серверге жіберу үшін «файлды жіберу» батырмасын басуы мүмкін.

CGI сценарийін баптау үшін cgitb модулін пайдалануға болады. Қате пайда болған кезде бұл модуль ерекшелеуді қоздыру орнын көрсете отырып, бояулы HTML-бетті береді. Жөнделген сценарийдің басында қою керек
import cgitb
cgitb.enable(1)

Немесе браузерде қателерді көрсету қажет болмаса:

import cgitb
cgitb.enable(0, logdir=»/tmp»)

Сценарий кейінге қалдырылған кезде бұл жолдарды алып тастау керек, өйткені ол сценарий кодының бөлігін береді. Бұл зиянкестер CGI-сценарийде осалдықты табу немесе парольдерді қарау үшін пайдалануы мүмкін (егер ондай сценарийде бар болса).

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *