Cgi Skript leitet weiter aber dann error

Django, Flask, Bottle, WSGI, CGI…
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

Hallo Leute,
Ich fange gerade mit der Programmierung einer Website an und habe einen login erstellt. Das ist eine HTML Seite auf einem apache Server auf meinem raspberrypi. Ich habe Auch einen python cgi Script der die Seite auswertet nd bei Knopfdruck auf der Seite das passwort usw überprüft. Dann, wenn das passwort stimmt wird der User zu seiner persönlichen Seite weitergeleitet(ich habe von Hand mehrere "acciuntseiten" erstellt) , und das klappt auch gut mit der Erstellung des URLs. Der URL stimmt auch und die Seite existiert so. Nur sagt der Browser das der Server einen "internal server error" hat.
Im Internet steht das das alles mögliche sein kann. Aber ich habe kein plan was es ist.. Hat jemand eine Idee warum genau die Seite nicht geladen wird?
Danke für antworten
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

CGI ist völlig veraltet und apache alles andere als leicht zu konfigurieren.
Benutze Flask oder Django und deren eingebaute Server und vergiss CGI und apache.
Benutzeravatar
__blackjack__
User
Beiträge: 13114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mister: Der Grund für einen 5xx-er Error steht in der Regel im Fehlerlog vom Webserver.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

__blackjack__ hat geschrieben: Donnerstag 19. März 2020, 23:44 @Mister: Der Grund für einen 5xx-er Error steht in der Regel im Fehlerlog vom Webserver.
Ah ja danke für den Tipp da werde ich mal nachsehen
Sirius3 hat geschrieben: Donnerstag 19. März 2020, 23:00 CGI ist völlig veraltet und apache alles andere als leicht zu konfigurieren.
Benutze Flask oder Django und deren eingebaute Server und vergiss CGI und apache.
Ich habe halt so ein Buch gekauft und da war das halt erklärt also habe ich es damit gemacht
Aber danke für den Tipp mit flask usw, das werde ich mir mal ansehen
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich habe halt so ein Buch gekauft und da war das halt erklärt also habe ich es damit gemacht
Dann muss man das Buch leider auch in Frage stellen. CGI ist seit > 10 Jahren nicht mehr Stand der Dinge, Webprogrammierung macht man mit Python via WSGI unter Einsatz eines Webframeworks wie Flask oder Django etc. Flask ist für kleine Sache einfacher. Wobei eigentlich mit Flask & Co alles einfacher ist als CGI.

Alle Webframeworks haben einen kleinen Server an Bord, ansonsten nimmt man einen WSGI-Applikationsserver wie gunicorn, ggf. noch mit nginx als Reverse Proxy davor. Hört sich kompliziert an, ist aber einfacher als CGI + Apache.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hm, vielleicht liegt das daran das man Apache gewohnt ist, aber so wirklich kompliziert ist der für viele Sachen IMHO *nicht*. Klar kann man da sehr komplexe Konfigurationen damit/dafür basteln, aber die Standardsachen sind tausendfach im Netz erklärt, weil das Ding so alt ist und das so oft gemacht wird. Und Apache ist in der Regel unter Linux auch der Standardwebserver. Sowie man irgendwas installiert was PHP verwendet, hat man in aller Regel auch den Apache als Abhängigkeit dabei.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

Ich seh es ähnlich. Ob ich jetzt gunicorn mit Apache oder nginx nehme ist vom Konfigurationsaufwand imho ähnlich einfach/umständlich.
Allerdings würde ich grade auf einem raspi vielleicht eher zu nginx, weil der doch noch ein wenig schlanker als Apache ist ;-).

Zu beiden Szenarien sollten sich auch Anleitungen finden lassen..
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

Danke für die Tipps! Wo finde ich eigentlich die Error logs vom apache 2 server beim Rpi?
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da wo du sie auch in jedem anderen Linux System findest. Hast du mal gegoogelt?
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

__deets__ hat geschrieben: Freitag 20. März 2020, 16:34 Da wo du sie auch in jedem anderen Linux System findest. Hast du mal gegoogelt?
Ja jetzt schon
Im error log steht: end of script output before headers: (meine Datei).html
Was muss ich ändern?
Benutzeravatar
__blackjack__
User
Beiträge: 13114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mister: CGI-Skripte sind dafür verantwortlich eine komplette HTTP-Antwort zu erzeugen. Mit Headern und Body (sofern es einen gibt). Und das wird durch eine Leerzeile voneinander getrennt. Du musst das also so ändern das eine komplette, korrekte HTTP-Antwort von Deinem Code ausgegeben wird. Oder eben kein CGI benutzen. Selbst WSGI-Anwendungen kann man zur Not per CGI anbinden wenn es denn unbedingt sein muss.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

Der cgi Skript überprüft ordnungsgemäß die Eingaben und erstellt dann die richtige httpseite die zum entsprechenden persönlichen Bereich weiterleitet. Der URL der Seite stimmt auch aber beim Aufruf bekomme ich dann den Server internal error. Das heisst doch dass die Übertragung oder Auswertung der HTML Seite scheitert oder nicht?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

beim Aufruf von was? Zeig' doch mal dein CGI-Skript hier. Dann braucht niemand raten.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mister: Nein, HTML-Seiten werden nicht ausgewertet, die Ausgabe des CGI-Skriptes wird vom Webserver geprüft ob die formal eine gültige HTTP-Antwort ist. Und das ist sie nicht.

Das Du ein CGI-Skript mit der Dateiendung *.html hast ist zwar nicht verboten, aber etwas ungewöhnlich.

Und wie schon gesagt CGI macht man heute nicht mehr. Wenn Du das machen willst, musst Du Dich halt auch mit HTTP auseinandersetzen. Da muss erst eine Statuszeile, dann Header, dann eine Leerzeile, und dann der Körper der Antwort kommen. Guckst Du beispielsweise auf Wikipedia: https://en.wikipedia.org/wiki/Hypertext ... r_Protocol
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

Das ist mein cgi skript:

Code: Alles auswählen

#! /usr/bin/python3
import cgi, cgitb
cgitb.enable()
response="""Content-type: text/html; charset=utf-8

<html>
<head>
<title>Login..</title>
<meta http-equiv="refresh" content="2;URL={}">
</head>

<body>Login...</body></html>"""
form=cgi.FieldStorage()
password=form.getvalue("pwrd")
name=form.getvalue("usrnm")
if (password=="abc" and name=="peter")==True:
    path="mainpeter"
elif (password=="def" and name=="fritz")==True:
    path="mainfritz"
else:
    path="error_login"
newURL=("users_lib/"+path+".html")
print(response.format(newURL))
Mainfritz und mainPeter sind halt test html seiten im zu sehen ob es funktioniert. Das skript prüft die Passwörter usw und erstellt Dan einen entsprechenden URL.
Benutzeravatar
__blackjack__
User
Beiträge: 13114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mister: `pwrd` und `usrnm`? Was soll dass denn? Klopapier ist knapp, aber an Buchstaben auf Kosten der Verständlichkeit braucht man wirklich nicht sparen.

Die Vergleiche mit ``== True`` sind unnütz, der Ausdruck davor liefert ja bereits einen Wahrheitswert.

Das ``if``-Konstrukt ist zudem so regelmässig und einfach, dass man das durch ein Wörterbuch ersetzen sollte das Name und Passwort auf den Pfadteil abbildet.

Namen schreibt man in Python klein_mit_unterstrichen. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Also `new_url` statt `newURL`.

Code: Alles auswählen

#!/usr/bin/python3
import cgi
import cgitb

cgitb.enable()
response = """Content-type: text/html; charset=utf-8

<html>
<head>
  <title>Login..</title>
  <meta http-equiv="refresh" content="2;URL={}">
</head>
<body>Login...</body>
</html>"""

credentials_to_path = {
    ("peter", "abc"): "mainpeter",
    ("fritz", "def"): "mainfritz",
}

form = cgi.FieldStorage()
path = credentials_to_path.get(
    (form.getvalue("username"), form.getvalue("password")), "error_login"
)
print(response.format("users_lib/{}.html".format(path)))
Den Fehlermeldungen nach scheint die HTML-Datei auf die umgeleitet wird als CGI-Skript angesehen zu werden und nicht als HTML-Datei.

Hat eigentlich schon mal jemand erwähnt, dass man heutzutage kein CGI mehr macht? Die Anbindung du jour heisst WSGI. Und es gibt da auch wirklich ganz kleine Rahmenwerke. Neben Flask beispielsweise auch Bottle. Das ist nur eine einzige Datei.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

Ja wie gesagt war das halt so in dem python Buch gezeigt und eswegen habe ich es so gemacht
Aber ich schaue mit bottle usw mal an
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

Nur ist der cgi skript garnicht das Problem glaube ich. Der leitet mich nämlich immer korrekt weiter und der richtige URL wird aufgerufen. Nur nach dem Aufruf kommt dann der Error. Die HTML Datei ist auch nicht beschädigt oder fehlerhaft, man kann sie in ihrem Verzeichnis öffnen. Nur der Aufruf über den Server scheitert, aber nicht weil es nicht vorhanden ist sondern wegen etwas anderem. Was könnte das sein???
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast apache so konfiguriert, dass er alle Seiten als CGI interpretiert. Hat __blackjack__ schon vermutet. Ohne die Konfigurationsdatei zu kennen, kann das natürlich niemand sicher sagen.
Mister
User
Beiträge: 36
Registriert: Freitag 24. Januar 2020, 21:58

Aber meine ganzen anderen Seiten die auf dem Server miteinander verlinkt sind funktionieren alle. Nur diese beiden Seiten nicht
Antworten