Het volgende zou moeten werken:
En messages liever niet met hoofdletters schrijven, omdat variabelen met hoofdletters gebruik worden voor variabelen die nooit veranderen (constanten dus)
class handler(BaseHTTPRequestHandler):
def __init__(self):
self.messages = 'Conversation started ' + time.strftime("%H:%M:%S")
def do_POST(self):
self.messages += '<br />' + query['message'][0]
Dat werkt dus helaas niet, de def_init moet dan een aantal extra variabelen hebben en de POST en GET methoden werken niet meer. Ik heb MESSAGES nu met kleine letters geschreven.
Inmiddels is het programmaatje iets interessanter geworden. HTML gebruiken kan in principe niet meer en er is ondersteuning voor plaatjes, video's en links door gebruik van img:, video: en link:. Er is wel nog een probleempje: op een of andere manier worden slashes verkeerd geïntepreteerd. Daardoor worden geopende elementen niet afgesloten.
Zo ziet de code van pagina eruit:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>personim</title>
<link rel="icon" type="image/gif" href="msn_ico.jpg" />
</head>
<body>
<font size="2">
<a href="index.html">Refresh this page</a><br />
<form name="input" action="index.html" method="post">Conversation started at 13:11:19<br />192.168.1.71(13:11:33): Lol<br />192.168.1.71(13:11:36): Mooi<br />192.168.1.71(13:11:37): Dus<br />192.168.1.71(13:11:47): <video src="http://tinyvid.tv/file/p8xrbyh7zjph.ogg" controls="true" /<br />192.168.1.71 <input type="text" name="message" />
<input type="submit" value="Send" />
en die van een selectie (Firefox, View selection source).
<font size="2">Conversation started at 13:11:19<br>192.168.1.71(13:11:33): Lol<br>192.168.1.71(13:11:36): Mooi<br>192.168.1.71(13:11:37): Dus<br>192.168.1.71(13:11:47): <video tabindex="0" src="http://tinyvid.tv/file/p8xrbyh7zjph.ogg" controls="true"><br>192.168.1.71 <input name="message" type="text">
<input value="Send" type="submit">
</video></font>
Merk op dat de slashes van programmacode zijn verdwenen. Hoe zou dat komen?
Zo is de code nu:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import os
import string,cgi,time
class handler(BaseHTTPRequestHandler):
messages = 'Conversation started at ' + time.strftime("%H:%M:%S")
previous = ''
def do_GET(self):
try:
if '?' in self.path:
index = self.path.index('?')
self.path = self.path[:index]
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
if self.path == '/' or self.path == '/index.html':
f = open(os.path.dirname(__file__) + '/index.html')
g = open(os.path.dirname(__file__) + '/footer.html')
self.wfile.write(f.read() + handler.messages + '<br />' + self.client_address[0] + g.read())
f.close()
g.close()
return
f = open(os.path.dirname(__file__) + self.path)
self.wfile.write(f.read())
f.close()
return
except IOError:
self.send_error(404,'File Not Found: %s' % self.path)
def do_POST(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
length = int(self.headers.getheader('content-length'))
#files, todo integrate
if ctype == 'multipart/form-data':
query=cgi.parse_multipart(self.rfile, pdict)
upfilecontent = query.get('upfile')
self.wfile.write("<html>POST OK.<br /><br /></html>")
self.wfile.write(upfilecontent[0])
#text
elif ctype == 'application/x-www-form-urlencoded':
if length > 400:
handler.MESSAGES += '<br />' + self.client_address[0] \
+ '(' + time.strftime("%H:%M:%S")+ '): ' + '<i>Message too long</i>'
f = open(os.path.dirname(__file__) + '/index.html')
g = open(os.path.dirname(__file__) + '/footer.html')
self.wfile.write(f.read() + handler.messages + '<br />' + self.client_address[0] + g.read())
return
qs = self.rfile.read(length)
query = cgi.parse_qs(qs, keep_blank_values=1)
if query.has_key('message'):
query = query['message'][0]
if handler.previous != query:
query = query.replace('<','<')
query = query.replace('>','>')
while 'vid:' in query:
index = query.index('vid:') + 4
if len(query[index:]) == 0 or query[index] == " ":
query = query.replace('vid:', 'vid:', 1)
break
if " " in query[index:]:
source = query[index:query.index(" ")]
else:
source = query[index:]
if source.endswith('.ogg') or source.endswith('.ogv'):
query = query.replace('vid:' + source, '<video src="' + source \
+ '" controls="true" /')
else:
query = query.replace('vid:'+ source, '<i>Video format not supported: </i><a href="' \
+ source +'" />', 1)
while 'img:' in query:
index = query.index('img:') + 4
if len(query[index:]) == 0 or query[index] == " ":
query = query.replace('img:', 'img:', 1)
break
if " " in query[index:]:
source = query[index:query.index(" ")]
else:
source = query[index:]
if source.endswith('.png') or source.endswith('.jpg') or source.endswith('.gif'):
query = query.replace('img:' + source, '<img src="' + source \
+ '" alt="' + source + '" />')
else:
query = query.replace('img:'+ source, '<i>Image format not supported: </i><a href="' \
+ source +'" />', 1)
while 'link:' in query:
index = query.index('link:') + 5
if len(query[index:]) == 0 or query[index] == " ":
query = query.replace('link:', 'link:', 1)
break
if " " in query[index:]:
source = query[index:query.index(" ")]
else:
source = query[index:]
query = query.replace('link:' + source, '<a href="' + source \
+ '" alt="' + source + '" />')
handler.messages += '<br />' + self.client_address[0] + '(' + time.strftime("%H:%M:%S")+ '): ' + query
handler.previous = query
f = open(os.path.dirname(__file__) + '/index.html')
g = open(os.path.dirname(__file__) + '/footer.html')
self.wfile.write(f.read() + handler.messages + '<br />' + self.client_address[0] + g.read())
f.close()
g.close()
return
def run(server_class=HTTPServer,
handler_class=BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler)
httpd.serve_forever()
if __name__ == "__main__":
run()
Valt hier
http://personim.googlecode.com/files/personimdev0.tar.gz te downloaden