Programowanie CGI Pythona
by admin · Luty 3, 2018
Czym jest CGI ?
(ang. Common Gateway Interface) – jest standardowym sposobem przekazywania przez serwer www żądania użytkownika do aplikacji i odbierania danych od aplikacji i przekazywanie ich użytkownikowi. Gdy użytkownik odwiedza stronę internetową (np. wprowadzając adres strony internetowej), serwer odsyła żądaną stronę. Takie działanie ma miejsce w przypadku stron statycznych, jednakże obecnie mamy w internecie przewagę stron dynamicznych, w przypadku których prezentowana strona jest generowana dynamicznie przez aplikację. Dzieje się tak na przykład w przypadku formularza na stronie internetowej. Użytkownik wypełnia dane w formularzu, przesyła je do serwera, następnie serwer otrzymane dane przesyła do aplikacji, która następnie przetwarza otrzymanie dane i zwraca wynik działania do użytkownika. Ta metoda, lub konwencja przekazywania danych tam i z powrotem między serwerem a aplikacją nazywa się CGI.
Konfiguracja serwera WWW
W celu poprawnego działania skryptów CGI konieczne jest odpowiednie skonfigurowanie serwera www. W moim przypadku serwerem www jest Apache i pokażę jak go skonfigurować do pracy z CGI. Konfigurację apache możemy wykonać w następujących krokach:
Krok 1.
Edytujemy zawartość pliku z naszą stroną (/sites-available/000-default.conf) odkomentowując linijkę: Include conf-available/serve-cgi-bin.conf
root@ubuntu-2:/usr/lib/cgi-bin# nano /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
Include conf-available/serve-cgi-bin.conf
</VirtualHost>
<IfDefine ENABLE_USR_LIB_CGI_BIN>
ScriptAlias /cgi-bin/ /home/kuba/scripts/
<Directory "/home/kuba/scripts/">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
AddHandler cgi-script .py
</Directory>
</IfDefine>
Krok 3.
Aktywujemy moduł cgi w apache i restartujemy apache’a.
root@ubuntu-2:/usr/lib/cgi-bin# a2enmod cgi
root@ubuntu-2:/usr/lib/cgi-bin# systemctl restart apache2
Pierwszy skrypt
Stwórzmy sobie pierwszy skrypt python, który wygeneruje nam stronę www z treścią Hello World !!!.
Skrypt ten wygląda następująco:
#!/usr/bin/python
print("Content-Type: text/html\n\n")
print('''
<html>
<head>
<title>Hello World - script</title>
</head>
<body>
<p>Hello Word !!!</p>
</body>
</html>
''')
Następnie skrypt musimy umieścić w naszym katalogu ze skryptami (/home/kuba/scripts) i nadać mu atrybuty wykonywalności (chmod +x).
Teraz pozostaje tylko otwarcie odpowiedniego linku w przeglądarce:
http://192.168.48.142/cgi-bin/hello.py
gdzie:
192.168.48.142 to adres naszego serwera,
hello.py to nazwa naszego skryptu.
Jeśli wszystko przebiegło pomyślnie naszym oczom powinna ukazać strona z zawartościa Hello World !!!.
KALKULATOR IP W PYTHON
Teraz spróbujmy napisać coś bardziej zaawansowanego w python, a mianowicie kalkulator IP. Do tego celu posłuży nam wbudowana Pythona biblioteka ipaddress, która umożliwia pracę z adresami IP.
Cała aplikacja będzie składać się z 3 plików:
- /var/www/html/index.html
- /home/kuba/scripts/script.py
- /home/kuba/scripts/calc.py
Zawartość plików jest następująca:
- /var/www/html/index.html
<html>
<head>
<title>IP Calculator</title>
</head>
<body>
<p>Python IP Calculator</p>
<iframe src="./cgi-bin/script.py" width="400" height="350"></iframe>
</body>
</html>
2. /home/kuba/scripts/script.py
#!/usr/bin/python
print("Content-Type: text/html\n\n")
print('''
<html>
<head>
<title>IP Calculator</title>
</head>
<body>
<p>INSERT IP AND SUBNET</p>
<form action = "calc.py" method = "get">
<input type = "text" value = "192.168.0.0" name = "ip"> IP Address (eg. 192.168.0.0)<br />
<input type = "text" value = "24" name = "subnet" /> Subnet Mask (eg. 24)<br />
<input type = "submit" value = "Calc" />
</form>
</body>
</html>
''')
3. /home/kuba/scripts/calc.py
#!/usr/bin/python
import cgi, cgitb, ipaddress
form = cgi.FieldStorage()
ip = form.getvalue('ip')
subnet = form.getvalue('subnet')
ips = unicode(ip+"/"+subnet)
intf = ipaddress.ip_interface(ips)
netmask = intf.with_netmask.split("/")[1]
print("Content-Type: text/html\n\n")
print('''
<html>
<head>
<title>IP Calculator</title>
</head>
<body>
<p>RESULTS</p>
''')
print"<p>IP Address <font color='blue'>%s</font></p>" % (ip)
print"<p>Subnet Mask <font color='blue'>%s = %s</font></p>" % (netmask,subnet)
print"<p>Wildcard Mask <font color='blue'>%s</font></p>" % (intf.network.with_hostmask.split('/')[1])
print"<p>Network <font color='blue'>%s</font></p>" % (intf.network.with_prefixlen)
print"<p>Broadcast <font color='blue'>%s</font></p>" % (intf.network.broadcast_address)
print"<p>Host Min <font color='blue'>%s</font></p>" % (intf.network[1])
print"<p>Host Max <font color='blue'>%s</font></p>" % (intf.network[-2])
print"<p>Hosts/Net <font color='blue'>%s</font></p>" % (intf.network.num_addresses-2)
print('''
</form>
</body>
</html>
''')
Zasada działania kalkulatora jest następująca:
Klient wchodzi na stronę http://192.168.48.142/index.html (plik /var/www/html/index.html). Strona składa się z ramki, w której wyświetlany jest wynik skryptu script.py. Wynikiem działania skryptu script.py jest formularz, składający się z pól tekstowych ip i subnet, oraz przycisku Calc, który uruchamia skrypt calc.py. Skrypt calc.py wykonuje operacje na podanych w formularzu polach ip i subnet i prezentuje na ich podstawie następujące wyniki:
IP Address – adres IP podany w formularzu,
Subnet Mask – maska podsieci podana w formularzu,
Wildcard Mask – maska w formacie wildard’owym,
Network – adres sieci,
Broadcast – adres rozgłoszeniowy,
Host Min – najmniejszy adres dostępny dla hosta,
Host Max – największy adres dostępny dla hosta,
Hosts/Net – ilość adresów dostępna dla hostów.
WYNIK
Sprawdźmy teraz jak wygląda aplikacja kalkulatora IP z punku widzenia klienta i jego przeglądarki. Otwórzmy w tym celu stronę index.html:
PODSUMOWANIE
Na powyższym przykładzie aplikacji www kalkulatora IP, widać, że Python z CGI dają olbrzymie możliwości tworzenia aplikacji internetowych przy wykorzystaniu skryptów. Oczywiście powyższe zastosowanie nie jest najlepszą i najwydajniejsza metodą tworzenia stron internetowych, ale pokazuję, że właściwie bez zaawansowanej znajomości kodowania stron www, możemy tworzyć łatwe formularze czy aplikacje wykorzystując skrypty Pythona. Do bardziej zaawansowanych aplikacji można skorzystać z nowoczesnego frameworka opartego na Pythonie a mianowicie Django.