cgi chat pythonban

hali!

irtam egy cgi chatet pythonban, es 2 dolgot szeretnek megoldani:
1. frissuljon, ha uj uzenet erkezik
2. amikor kuldok egy uzenetet es refreshelek, akkor megint elkuldi

lecci segitsetek itt a kod:
-------------------------------------------------------------------------------------
#!/usr/bin/python
import cgitb; cgitb.enable()
from server import *
import slhtml
import time
import cgi
import os

thetime = time.asctime()[11:16]

def checkban(banlist, ip):
f = open(banlist, "r")
bans = f.read()
f.close()
if ip in bans:
print "< div align=\"center\" >< h2 >You're banned!< /h2 >< /div >"
slhtml.end_html()
exit()

def readhistory(history_file):
f = open(history_file, "r")
history = f.readlines()
f.close()
history.reverse()
count = 0
for message in history:
if count < 26:
print message+"< br / >"
count += 1
else:
pass

def writehistory(history_file, content):
f = open(history_file, "a")
f.write(content+"\n")
f.close()

def write_log(log_file, content):
f = open(log_file, "a")
f.write(content+"\n")
f.close()

def msg():
print """
< p >< h2 >Message< /h2 >< /p >
< form method="post" action="%s/cgi-bin/chat.py" >
< p >Name:< /p >
< p >< input type="text" name="name" size="26" / >< /p >
< p >Message:< /p >
< p >< textarea name="msg" cols="30" rows="3" >< /textarea >< /p >
< p >< input type="submit" value="Send!" >< /p >
< /form >""" % (Server.host)

def main():
slhtml.start_html("chat.py", "#000000", "#00ff00")
print "< div align=\"center\" >< h1 >CGI Chat< /h1 >< /div >"
checkban("/var/www/chat/banlist", os.environ["REMOTE_ADDR"])
msg()
form = cgi.FieldStorage()
if form.has_key("name") and form.has_key("msg"):
writehistory("/var/www/chat/history", "[%s] <%s> %s" % (thetime, form["name"].value, form["msg"].value))
write_log("/var/www/chat/log", "[%s] < %s > %s (%s)" % (thetime, form["name"].value, form["msg"].value, cgi.escape(os.environ["REMOTE_ADDR"])))
readhistory("/var/www/chat/history")
else:
readhistory("/var/www/chat/history")
slhtml.end_html()

if __name__ == "__main__":
main()

Hozzászólások

Csak ötlet szinten:
ha írsz hozzá egy kezdetleges webservice-t, ami kontrollálja a csetelést, nem lehet megoldás?

Nem konkrétan csak a cgi-hez kapcsolódik, inkább egyfajta technológia. Nagyon lesarkítva egy háttérben futó/figyelő szolgáltatás, amit ha meghívsz: képes adatot fogadni, műveleteket végrehajtani, értéket visszaadni. Annyival bővülne ki a jelenlegi séma, hogy pl az oldal továbbadja a form adatait a webservice-nek, és az összes többi műveletet a webszervizzel kezeled le -pl. ellenőrzöd a frissítés miatti duplikált üzenetet. Mivel a service folyamatosan fut, a beszélgetést be tudod rakni egy neked tetsző változóba, le tudod menteni xml-be stb.
http://pywebsvcs.sourceforge.net/zsi.html#SECTION003100000000000000000

igen, egesz jo lenne, de nekem ugy tunik tobb ido lenne megtanulni, mint egy sajatot megirni. most ujrakezdtem, tobb modulban, listakkal, satobbi, eddig megvan a kinezet, a bannolas megnezese, es a neveket is automatikusan ip cimhez koti, szerintem egesz jo lesz :) egyebkent szerinted, ha ugy kezelem az uzeneteket, hogy lementem egy txt fajlba, es onnan nyitom mindig meg es adom hozza, az mennyire hasznalhato?

ez nagyban fugg attol, hogy mekkora sereglet ellatasara tervezed az alkalmazast.
ha txt-t, xml-t hasznalsz akkor szep es olvashato allomanyban tudsz adatokat tarolni, de hamar oriasira tudnak hizni, es ezzel egyenes aranyban romlik a kezelhetoseg es a performancia. A kov. lehetoseg vmi. egyszeru beepitett db motor hasznalata -pl SQLite. Ezzel es nemi optimalizacioval egesz jol kezelhetoek a fenti gondok egy bizonyos szintig. A kov. lepes pedig vmi db motor hasznalata -PostgreSQL, MySQL... Ez a megoldas skalazhato, es eros igenybevetelnel jobb a teljesitmenyt nyujt - persze az a feltetel itt is all, h jol van felepitve az alkalmazas es a db.

Nem valami ilyesmire jó a PUSH http kérés? (nemtom kérdem)

Nagyon Ronda megoldás:
Frameset+HTML Refresh :P

Normális megoldás: Javascript periodic refresh

http://ajaxpatterns.org/Periodic_Refresh

Jó leírás,de angol.

### ()__))____________)~~~ ###
#"Ha én veletek, ki ellenetek?"
#ASUS eee 900 //Puppy 4.3

nem, megse lesz jo... azt nem tudjatok veletlenul, hogy hogy tudnam azt teljesen cgi-ben megirni, hogy minden kliensnek egy bizonyos pillanatban frissuljon az oldal? vagy az is jo lenne ha lenne 1 szovegdoboz, amit nem lehet szerkeszteni, es az folyamatosan frissulne, de nem az egesz lap. szoval van egy frame, amin megy a chat szovege es csak az frissul.

Ha frameset megoldást írsz akkor elve kell 3 lap... egy HTML amiben a framek vannak. Egy frame amiben a chat szövege frissülget.
meg egy másik amiben a beírkálós form van.

index.html
azUtolsoXUzenetetkiiro.py
aBeirogatosResztMegjeleito.py

9 éve nem láttam frameseteet de kb
-CUT:index.html----------------------------------------

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>NagyonChat</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>

<frameset rows="*,200" cols="*" framespacing="0" frameborder="no" border="0">
<frame src="azUtolsoXUzenetetkiiro.py" name="topFrame" >
<frame src="aBeirogatosResztMegjeleito.py" name="mainFrame" scrolling="NO" noresize>
</frameset>
<noframes><body>

</body></noframes>
</html>
--CUT---------------------------------------------------

A megjelenítős py. meg írjon ki egy ilyet:

<meta http-equiv="refresh" content="10;url=?" />

ez ugye 10 masodpercenkent refreshel

### ()__))____________)~~~ ###
#"Ha én veletek, ki ellenetek?"
#ASUS eee 900 //Puppy 4.3b3

szal ha kulon ramegyek a beirogatosra akkor bejon a masik is? lehet nem ertem :) mind1 kiprobalom

szerk: megcsinaltam most meg megy egy kicsit aztan leallitom, ha olvasod kb fel 10 elott, nezd meg (am egesz jo), de azt meg mindig nem vagom, hogy most van 3 resze, es hogy azt hogyan tudom megcsinalni, hogy kulon ne lehessen elerni a reszeket, urlbol vagy ilyesmi

Éppen hasonló példaprogramot csináltam a tanítványaimnak.

Teljesen alaptudású chat program, de éppen a kliensek frissítése implementálva van benne. A szerver persze Java, nem Python, de nem lehet minden kerítés kolbászból.

Itt van online a csetprogram maga:
http://rizsi.com/webapp.html

És itt van hozzá forrás, ha esetleg érdekel:
svn://rizsi.com:9000/szig2009/trunk/examples/hu.szig.web