Kasulikke pythoni näitejuppe cgi jaoks

Allikas: Lambda

Scripti algusse sobib enamasti (cgitb.enable() ainult debugimise ajaks!):

#!/usr/bin/python
import cgi,cgitb

cgitb.enable() # see peaks siis kusagil üpris algul olema

print "Content-type: text/html\n\n" # mõistlik panna kohe programmi algusse
print "tere tali!"

NB! Selleks, et linuxi käsurida peaks faili programmiks, mida igaüks võib käima panna ja lugeda, tee nii:

chmod a+rx minuproge.py


Kui sinu koodis on täpitähti, siis on vaja kirjutada programmi teiseks reaks järgmine maagiline sõnum, mis ütleb konkreetse täpitähtede encodingu (tõenäoliselt on sul kas iso-8859-1 või utf-8). Alternatiiv sellele maagilisele sõnumile on lihtsalt mitte kasutada täpitähti.

#!/usr/bin/python
# -*- coding: iso-8859-1 -*-

vormilt data võtmiseks anna urlilt ette nim/väärtus paarid nii:

http://dijkstra.cs.ttu.ee/~tammet/cgi-bin/proov.py?nimi=koer&email=a@b

kus küsimärk ? on peale proge nime, = eraldab nimi/väärtust ja & eraldab eri nimi/väärtus paare.

vormilt data võtmisel tasub kontrollida, kas data tuli, muidu annavad osad Pythoni versioonid errori (aga enne peab su proges olema rida import cgi):

formdata = cgi.FieldStorage()

if formdata.has_key("nimi"):
  nimi=formdata['nimi'].value
if formdata.has_key("email"):
  email=formdata['email'].value
if formdata.has_key("raha"):
  raha=formdata['raha'].value

Pane tähele, et ifi ja while jms sees peavad kõik asjad olema sama taandega ja taande lõpp märgib bloki lõppu.

Väike näide pikemast ifist ja tsüklist (jällegi, taane määrab bloki lõpu ja iga ifi ja while jms lõpus on koolon :)

x=2
y=3
if x<10 and y<10: # loogikatehted on not, and, or 
  i=0
  while i<5:    
    print i
    i=i+1
elif x<100:
  print "else if asemel on kokku kirjutatud elif"  
else:
  print "kõik muud cased"

Niimoodi defineerid - ja kutsud välja - funktsiooni:

def myfun(x):
  print "callisid myfuni"
  return x+10

y=myfun(2)

Niimoodi (kolm " järjest) saad koodi panna mitmerealise stringi, kus võivad jutumärgid otse sees olla:

mystr="""siin on
üks pikk string " kus jutumärgid
sees"""

NB! ära kunagi kasuta muutujana sõnu str, int, float jne: sel juhul rikud neile vastavad funktsioonid!

Niimoodi saad juhusliku täisarvu:

import random # see oleks siis kusagil programmi alguses teiste importide seas
...
oppmove=random.randint(0, 2) # täisarv kas 0,1,2. Juhusliku floati jaoks 0...1 tee random.random()

Niimoodi saad teha stringi täisarvuks ja täisarvu (või mistahes muu data!) stringiks:

strx="1"
x=int(x)
uusstrx=str(x)

NB! Kui proovid stringile arvu liita a la "abc"+1 saad errori. Enne pead arvu tegema stringiks a la "abc"+str(1)

Niimoodi saad faili lõppu midagi juurde kirjutada (open(...,'a') ehk append mode):

data="mingitekst"
f = open('/tmp/tahvel', 'a')  # faili täielikuks ülekirjutamiseks pane 'a' asemel 'w'
f.write(data)
f.close()

Niimoodi saad programmi töö hoobilt lõpetada:

import sys # see oleks siis kusagil programmi alguses teiste importide seas
...
sys.exit(0)

Niimoodi loed failist korraga kõik read massiivi (iga rida - string - üks massiivielement) ja samas kontrollid, et kui faili pole/lugemisviga, siis handlid seda viga:

try:
  f = open('/tmp/myfile', 'r')
  data=f.readlines()
  f.close()
except:
  print "ei saanud faili avada!"  
  sys.exit(0) # eeldab, et oled varem teinud import sys ja juba trükkinud content-type rea koos tühja vahereaga

Sama, mis eelmine, aga terve fail loetakse ühe stringina:

try:
  f = open('/tmp/myfile', 'r')
  data=f.read()
  f.close()
except:
  print "ei saanud faili avada!"  
  sys.exit(0) 

Niimoodi saad asendada stringijuppe:

mystr="xx yy xx"
res=mystr.replace("xx","zzz") # tulemuseks "zzz yy zzz"

Niimoodi saad splittida stringi juppideks whitespace järgi:

mystr="ab c 123   a "
m=mystr.split() # tulemuseks ['ab', 'c', '123', 'a']

Niimoodi saad teha tsükli üle kogu massiivi:

m=["a","b","c"]
for el in m:
  print el

ja sama asi harilike indeksitega:

m=["a","b","c"]
i=0
while i<len(m):
  print m[i]
  i=i+1


Html vormi välja autocomplete saad niimoodi maha keerata:

<input type="text" name="nimi" autocomplete="off">

See kood genereerib automaatselt refreshiva html lehe (now peaks olema arv: sekundid):

  print """
<html>
<head>
<meta 
http-equiv="refresh" 
content='1;url=save.py?refreshing=1&now="""+str(now)+"""'>
</head>
<body>
"""