cgi fehler

Django, Flask, Bottle, WSGI, CGI…
Antworten
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

ich habe mit cgi pthon angefangen und eine kleine test datei erstellt:

Code: Alles auswählen

#!/usr/bin/env python
print "Content-Type: text/html"
print

print'test seite'
als server software benutze ich xampp bekomme abber als fehlermeldung im browser

Serverfehler!

Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.

Fehlermeldung:
Premature end of script headers: hm.cgi

Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber.
Error 500
localhost
Sa 28 Mai 2011 22:05:09 CEST
Apache/2.2.17 (Unix) DAV/2 mod_ssl/2.2.17 OpenSSL/1.0.0c PHP/5.3.5 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1



kann mir jemand helfen ich weis nicht mehr weiter

lg ceddy :D
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Möchtest du dich wirklich mit cgi rumschlagen?

Wieso nutzt du nicht bottle oder flask?
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
BlackJack

@ceddy: Und was sagt das Fehlerprotokoll vom Webserver dazu?
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

@BlackJack

kanst du mir bitte sagen wo ich das in lampp/xampp finde??

@jbs

Ein webframework macht für mich wirklich Sinn, da es nacher einfach nur darum geht Teile des Server Pcs über ein webinterface zu steuern, also keine komplexen Datenbankarbeiten oder sowas;)

danke schonmal für die schnellen antworten
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ceddy hat geschrieben: Ein webframework macht für mich wirklich ¹ Sinn, da es nacher einfach nur darum geht Teile des Server Pcs über ein webinterface zu steuern, also keine komplexen Datenbankarbeiten oder sowas;)
Du musst ja kein Full-Stack-Framework wie Django nehmen. Flask und Bottle sind durchaus auch für kleinste Webanwendungen geeignet. Ich wette sogar, dass Du damit weniger "Tipparbeit" hast, als mit low level CGI.

¹ (Du hast wohl ein "keinen" vergessen nehme ich mal an)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

stimmt da sollte eigentlich 'keinen' stehen, naja ich werd mir mal bottle angucken;)
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

ich möchte das jetzt natürlich mit einem password schützen, dafür hab ich ein session cookie verwendet:

Code: Alles auswählen

#! /usr/bin/python
from bottle import route, run, get, post, request
import os

#@route('/admin')
@get('/admin')
def login():
	return'''
			<form method="POST">
				<input name="pwd" type="password" />
			</form>'''

#@route('/admin')
@post('/admin')
def login_check():
	pwd=request.forms.get('pwd')
	if pwd=='test':
		return'''Login Erfolgreich<br />

		 <a href='/admintools'>Admin tools</a>
		'''
		
		response.set_cookie('acc','ceddy',secret='asdadsa')
			
	else:
		return'Login Falsch'

@route('/admintools')
def admintools():
	login = request.get_cookie("acc", secret='asdadsa')
	if login:
		return'Sie haben zugriff'
	else:
		return'Zugriff verweigert'

   


run(host='localhost', port=8080)
wenn ich jetzt auf /admintools gehe bekomme ich aber die Fehlermeldung vom server:

Error 500: Internal Server Error

Sorry, the requested URL http://localhost:8080/admintools caused an error:

Unhandled exception
BlackJack

@ceddy: Ruf mal vor der `run()`-Zeile `bottle.debug()` mit `True` als Argument auf. Ansonsten auch da wieder: genaueres sollte im Fehlerprotokoll vom Webserver stehen. Wo das liegt? Selbst rausfinden. :-) (Bei mir unter ``/var/log/apache2/error.log``.)

Edit: Okay ich bin offiziell ein Idiot. :oops: Du verwendest hier ja den internen Webserver von Bottle zum Testen und nicht den Apache. Da wird das Protokoll doch aber in der Konsole ausgegeben in der Du das Programm gestartet hast!?

Und bei mir bekomme ich auch keinen Server-Error sondern ein "Zugriff verweigert". Kann es sein, dass Du im Browser keine Cookies annimmst?
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

der debugger gibt das aus:

Traceback:

Traceback (most recent call last):
File "/usr/lib/pymodules/python2.7/bottle.py", line 499, in handle
return handler(**args)
File "/home/cedric/bottle/test.py", line 31, in admintools
login = request.get_cookie("acc", secret='asdadsa')
File "/usr/lib/pymodules/python2.7/bottle.py", line 827, in get_cookie
dec = cookie_decode(value, secret) if secret else None
File "/usr/lib/pymodules/python2.7/bottle.py", line 1120, in cookie_decode
if cookie_is_encoded(data):
File "/usr/lib/pymodules/python2.7/bottle.py", line 1129, in cookie_is_encoded
return bool(data.startswith(u'!'.encode('ascii')) and u'?'.encode('ascii') in data) #2to3 hack
AttributeError: 'NoneType' object has no attribute 'startswith'






doch cookies nihmt er ganz sicher;D
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

der Fehler ist, dass du den Cookie _nach_ der return-Anweisung setzen willst. Was de facto heißt, dass der Cookie nicht gesetzt wird. :-)

Weiterhin solltest du unter "admintools" einen try...except Block setzen, sonst bekommst du eine Exception, wenn du versuchst, "admintools" ohne vorherigen Login aufzurufen.

Der folgende Code funktioniert:

Code: Alles auswählen

#! /usr/bin/python
from bottle import route, run, debug, get, post, request, response
import os

@route('/admin')
def login():
        return'''
                        <form method="POST">
                                <input name="pwd" type="password" />
                        </form>'''

@post('/admin')
def login_check():
        pwd=request.forms.get('pwd')
        if pwd=='test':
                response.set_cookie('acc', 'ceddy', secret='asdadsa')
                return'''Login Erfolgreich<br />

                 <a href='/admintools'>Admin tools</a>
                '''                      
        else:
                return'Login Falsch'

@route('/admintools')
def admintools():
        try:
                login = request.get_cookie('acc', secret='asdadsa')
        except AttributeError:
                login = None
        if login:
                return'Sie haben zugriff'
        else:
                return'Zugriff verweigert'

   
debug(True)
run(host='localhost', port=8080, reloader=True)
BTW: Warum nimmst du 8er Einrückung statt der üblichen 4er?

Gruß, noisefloor
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

dankeeee, war halt so eingestellt;)

abber irgendwie funktionieren da normal epython befehle wie os.system('...') nicht und das brauche ich dringend;D
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
abber irgendwie funktionieren da normal epython befehle wie os.system('...') nicht und das brauche ich dringend;D
Ohne Code und konkrete Fehlermeldung kommen wir da wohl kaum weiter...

Gruß, noisefloor
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

stimmt tut mir leid

Code: Alles auswählen

#! /usr/bin/python
from bottle import route, run, debug, get, post, request, response
import os

@route('/admin')
def login():
        return'''
                        <form method="POST">
                                <input name="pwd" type="password" />
                        </form>'''

@post('/admin')
def login_check():
        pwd=request.forms.get('pwd')
        if pwd=='test':
                response.set_cookie('acc', 'ceddy', secret='asdadsa')
                return'''Login Erfolgreich<br />

                 <a href='/admintools'>Admin tools</a>
                '''                      
        else:
                return'Login Falsch'

@route('/admintools')
def admintools():
        try:
                login = request.get_cookie('acc', secret='asdadsa')
        except AttributeError:
                login = None
        if login:
                return'''Sie haben zugriff
			<form method="POST">
				Server:<br />
				<input type="submit" name="1" value="Herrunterfahren" /><br />
				<input type="submit" name="2" value="Neu starten" />
			</form>
		'''

        else:
                return'Zugriff verweigert'

@post('/admintools')
def excute():
	if (request.forms.get('1')<>None):
		return'Fahre herrunter'
		os.system('shutdown -r now')
	elif (request.forms.get('2')<>None):
		return'Beginne mit Reboot'
		os.system('shutdown -h now')	
	#x=request.forms.get('test1')
	#x=request.forms.get('test2')
	

   
debug(True)
run(host='localhost', port=8080, reloader=True)
also wenn man jez auf die Buttons zum herrunterfahren(neu starten drückt kommt zwar die entsprechende meldung sonst passiert abber nichts(das ist unter ubuntu)

lg
BlackJack

@ceddy: Das hatten wir doch gerade schon: ``return`` beendet die Funktion. Das kehrt *sofort* zurück.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Wo hast du denn das <> her?

Und ist nicht -r reboot? Dann stimmen die prints nicht. Um ifs braucht man auch keine Klammern.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

jbs hat geschrieben:Wo hast du denn das <> her?
Das "<>" ist eine alte (doch wahrscheinlich von Basic stammende) Variante für "!=", die Python 2.x immer noch unterstützt.

Sollte man aber nicht mehr benutzen. Und schon gar nicht, auch das "!=" für einen Vergleich mit "None". Dort ist "is not None" besser.

Stefan
Antworten