HTMLGUI

Code-Stücke können hier veröffentlicht werden.
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

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


cp != mv
Benutzeravatar
SigMA
User
Beiträge: 181
Registriert: Sonntag 4. April 2004, 13:27
Wohnort: Freiburg
Kontaktdaten:

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
Leichtdio.de - Das Kreativ-Blog
http://www.leichtdio.de
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.
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

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
cp != mv
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

so kompliziert ist das doch nicht oder?
cp != mv
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.
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

hmmm, naja probieren geht über studieren, ich meld mich dan in ein paar tagen wieder
cp != mv
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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"

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

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:
cp != mv
Antworten