Seite 1 von 1

HTMLGUI

Verfasst: Dienstag 7. November 2006, 12:37
von Costi
es lauft nur unter windows (wegen hta, ein browser machts aber auch) und unterstuezt keine POST requests

das ganze ist eigentlich nicht so richtig praktisch anwendbar, die kernidee ist aber glaub ich schon interesant

ueber feedback wuerde ich mich freuen :)

edit:
thx an BlackJack, Leonidas und andere die mir dafuer ein paar fragen beahtwortet haben :D :D :D

Code: Alles auswählen

from socket import *
from tempfile import gettempdir
from time import sleep
import sys
from urlparse import urlsplit
from os import system
from cgi import parse_qs

 
class HTMLGUI:
	def __init__(self, defs, htaOpt = {}, host = "127.0.0.1", port = 80, maxClients = 5, title = ''):
		s = socket(AF_INET, SOCK_STREAM)
		s.bind((host, port))
		s.listen(maxClients)
		self.s = s
		
		z = {}
		for i in defs:
			if i.__name__ == "index":
				z["/"] = i
			z["/" + i.__name__] = i
		self.defs = z
		print self.defs
		
		html = '<html><head><title>' + title + '</title><hta:application \n'
		for key, value in htaOpt.iteritems():
			html += key + '="' + value + '"\n'
		html += '></head><body><iframe frameborder="no" marginheight="0" marginwidth="0" height="100%" width="100%" src="http://127.0.0.1:' + str(port) + '"></body></html>'
		
		file = gettempdir() + "\\start123.hta"
		f = open(file, "w")
		print "writing:", html
		f.write(html)
		f.close()
		print system("start " + file)
		
	def handleReq(self):
		client, address = self.s.accept()
		resp = client.recv(1024)
	
		req = resp.splitlines()[0].split()[1]
		z = urlsplit(req)#[2]
		reqFile = z[2]; query = z[-2]
		param = parse_qs(query)
		z = {}
		for i, i2 in param.iteritems():
			z[i] = ''.join(i2)
		param = z
		
		print "param:", param, "requested file: ", reqFile
		
		if reqFile in self.defs.keys():
			self.defs[reqFile](param, client.send)
		else:
			print "bad request for", reqFile#; sys.exit(1)
			client.send("file " + reqFile + " not found goto <a href=index>index</a>")
		client.close()
		
		return address, client #schadet sicher nicht


#--------------beispiel----------
def test(param, send):
	send("abc")
	
def index(param, send):
	send("hier index <a href=/test>test</a>")

def hello(param, send):
	send("hello " + param["name"])

	
htmlMk = HTMLGUI(defs = [test, index, hello], title = "maria, maria i like it now...")
while 1:
	htmlMk.handleReq()#threading oa einzubauen waere kp



Verfasst: Dienstag 7. November 2006, 19:54
von SigMA
Wenn ich das richtig sehe, dann stellt es eine GUI in HTML Form da oder?

Sowas such ich schon die ganze Zeit .. Schade das es nicht für Linux ist :(

SigMA

Re: HTMLGUI

Verfasst: Dienstag 7. November 2006, 21:15
von BlackJack
Costi hat geschrieben:es lauft nur unter windows (wegen hta, ein browser machts aber auch) und unterstuezt keine POST requests

das ganze ist eigentlich nicht so richtig praktisch anwendbar, die kernidee ist aber glaub ich schon interesant

ueber feedback wuerde ich mich freuen :)
Warum zum $TEUFEL hast Du nicht den Server benutzt den es schon in der Standardbibliothek gibt? Der funktioniert nicht nur unter Windows und kann auch POSTs. Der hält sich an die entsprechenden RFCs die Du wahrscheinlich noch nicht einmal gelesen hast.

Verfasst: Mittwoch 8. November 2006, 16:02
von Costi
naja das war sagen wir nur eine pre-release, ich hab am freitag + wochenende wieder zeit und schreib das dan nochmal alles ordentlich neu mit unix unterstuezung + POST + zugriff auf environs, usw

@BlackJack: nein, ich werde afuer nicht socketServer, baseHttp oder weis der $TEUFEL was benutzen :wink:


gruesse
costi

Verfasst: Mittwoch 8. November 2006, 17:23
von Leonidas
Costi hat geschrieben:@BlackJack: nein, ich werde afuer nicht socketServer, baseHttp oder weis der $TEUFEL was benutzen :wink:
Oh, planst du einen standardkonformen HTTP/1.1 Server zu implementieren, der die RFCs vollständig umsetzt? Sehr lobenswert!

Verfasst: Mittwoch 8. November 2006, 17:49
von Costi
so kompliziert ist das doch nicht oder?

Verfasst: Mittwoch 8. November 2006, 18:57
von BlackJack
Kommt drauf an was man so kompliziert nennt. Das HTTP 1.1 RFC ist eine ca. 9800 Zeilen Textdatei (176 Seiten) und das CGI RFC bringt's auf ca. 2000 Zeilen (36 Seiten).

Natürlich muss man nicht alles aus dem HTTP RFC implementieren, aber verstanden haben was man weglässt wäre sicher gut.

Verfasst: Mittwoch 8. November 2006, 21:14
von Costi
hmmm, naja probieren geht über studieren, ich meld mich dan in ein paar tagen wieder

Verfasst: Donnerstag 9. November 2006, 12:08
von Y0Gi
Es wäre sicherlich hilfreich, entweder im ersten Beitrag oder zumindest im Code, idealerweise aber an beiden Stellen (Beitrag: deutsch, Code: Englisch [s. PEP 8]) zu beschreiben, wofür der Code überhaupt gut sein soll.

Verfasst: Donnerstag 9. November 2006, 13:02
von jens
btw. Sternchenimport wie from socket import * sind generell unschön... Vielleicht sollten wir mal im Wiki eine Seite machen über "Was man häufig falsch macht"

Verfasst: Sonntag 12. November 2006, 21:44
von Costi
Es wäre sicherlich hilfreich, entweder im ersten Beitrag oder zumindest im Code, idealerweise aber an beiden Stellen (Beitrag: deutsch, Code: Englisch [s. PEP 8]) zu beschreiben, wofür der Code überhaupt gut sein soll.
btw. Sternchenimport wie from socket import * sind generell unschön... Vielleicht sollten wir mal im Wiki eine Seite machen über "Was man häufig falsch macht"
ok, nächstes mal

naja das war sagen wir nur eine pre-release, ich hab am freitag + wochenende wieder zeit und schreib das dan nochmal alles ordentlich neu mit unix unterstuezung + POST + zugriff auf environs, usw
jooaaa :oops: , alsooo bin leider nicht dazu gekommen, musste mich mit "wichtigeren" dingen wie den aufbau einer zelle, fiktionäre, langweilige englisch-texte und anderen mist beschaftigen und dat is dan alles zu viel für mein kopfchen :cry: