Python ja CGI-ohjelmointi

CGI eli Common Gateway Interface on yksinkertaisin rajapinta WWW-sovelluksien tekemiseen

HTML-dokumentti Python-kielellä ja CGI-rajapinnan kautta tuotettuna:

#!/opt/rh/rh-python38/root/usr/bin/python3.8
# -*- coding: utf-8 -*-
import cgitb
cgitb.enable()

print("""Content-type: text/html; charset=UTF-8

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Malli</title>
  </head>
<body>
  <h1>Tulostetaan Pythonilla:</h1>
  <p>
""")

print("Hello World! Osaatkönä skändejä?")
print("""
  </p>
</body>
</html>
""")

Virheilmoitukset ja asetukset

Pythonilla tehtyjen CGI-ohjelmien debuggaamista helpottaa cgitb-moduulin käyttöönotto:

import cgitb
cgitb.enable()

cgitb aiheuttaa virheraporttien näyttämisen www-selaimessa tai niiden tallentamisen tekstitiedostoon.

Oletuksena cgitb-kirjasto tulostaa virheilmoitukset HTML-muodossa. Jos haluat tekstimuotoisen tulostuksen niin käytä kutsua:

cgitb.enable(format="text")

CGI-ohjelmat users.jyu.fi-palvelimella

Viimeisimmät tiedot löytyvät aina digipalvelujen ohjeesta: CGI/SSI-tekniikoiden käyttäminen www-palveluissa (users.jyu.fi/groups.jyu.fi)

Python ja merkistöt

Querystring

Flask ja users.jyu.fi

Lopullinen sovellus pitää yleensä saada toimimaan muualla kuin omalla koneella ja toiminnallisuudessa voi olla eroja esim. tiedostopolut voivat olla erilaisia. Debuggaus on kuitenkin huomattavasti helpompaa omalla koneella. Jos on W:-asema verkkolevynä niin voi suoraan sieltä ajaa sovellustaan oman koneen Flaskilla ja testailla samaan aikaan myös users.jyu.fin kautta.

Flaskia aloitellessa muistakaa users.jyu.fi:ssä kaikki temput mitä vaadittiin, että cgi-ohjelma lähtee toimimaan:

users.jyu.fi

Kts. pääteohjaus 1

Flaskin debuggaus users.jyu.fi:ssä

Joskus täytyy itse logata virheet. Seuraava tekee lokitiedoston kansioon '../hidden/'. Korjaa polku oikeaksi:

import logging
logging.basicConfig(filename=os.path.abspath('../hidden/flask.log'),level=logging.DEBUG)
logging.debug("Tänne mitä haluaa lokiin kirjoittaa")

Älä kirjoita lokia cgi-bin-kansioon tai sen alikansioihin!. Tämä ei toimi.

Jotta lokista olisi iloa on käytettävä try..exceptiä. Nappaa exceptillä kiinni mahdolliset virheet ja dumppaa virheilmoitus lokiin:

try:
       # sqlite haluaa absoluuttisen polun
       con = sqlite3.connect(os.path.abspath('../hidden/resepti'))
except Exception as e:
       logging.debug("Kanta ei aukea")
       # sqliten antama virheilmoitus:
       logging.debug(str(e))

Lokin sisältöä vo seurailla helpoiten ottamalla pääteyhteyden halavaan ja käyttämällä tail-komentoa:

tail -f flask.log

Tämä kyttää koko ajan tiedoston sisältöä ja näyttää heti sinne tulevat uudet rivit.

Järkevintä on debugata omalla koneella olevalla Flaskilla, koska siellä näkyy suoraan palvelimen virheloki.

Esimerkkejä

Python ja CGI-ohjelmointiluento (youtube, 2016)

Vanha Python ja CGI-ohjelmointiluento (youtube, 2014)

JSON, omat luokat, lomakkeen korvaaminen linkillä (Lähdekoodi, Template )

ostoskori.cgi (lähdekoodi, template)

Lisätietoa

Käyttäjien kommentit

Kommentoi Lisää kommentti