CGI
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
CGI
Hi zusammen.
Ich mache gerade meine ersten Gehversuche, ein CGI Programm mit Lazarus/Freepascal zu erstellen.
Der erste Test war vielversprechend: ein mit Lazarus erstellter Dreizeiler (commandline- "Programm") an die richtige Stelle auf dem Server meines ISP platziert und die richtigen Datei-Rechte gesetzt, schon kommt die "writeln" Ausgabe des Programms im Browser an, wenn man den richtigen URL ansurft.
Nun möchte ich mit dem FP Programm eine Datei lesen und schreiben. Ein sinnvoller Platz für die Datei wäre vermutlich irgendwo innerhalb des Directories, in dem sich das Programm selbst befindet. Da ein commandline-"Programm" kein "Application" hat bekomme ich das komplett spezifizierte Directory des Programms mit paramstr(0).
Das klappt zumindest auf meinem Suse. Aber auf dem Linux Server des ISP klappt das nicht. Auch wenn ich das Programm nicht per Webserver als CGI, sondern per Telnet starte ist Paramstr(0) ein Leerstring, auch wenn ich mich in einem Directory befinde das in Telnet z.B. /web/cgi-bin heißt und das Programm mit ./test gestartet wird.
Wie kann ich denn den kompletten Pfad meiner Programmdatei ermitteln ?
P.S.: Lazarus bietet als Projekt auch "CGI-Program" an. Gibt es irgenteine Doku, wie man das verwendet ?
-Michael
Ich mache gerade meine ersten Gehversuche, ein CGI Programm mit Lazarus/Freepascal zu erstellen.
Der erste Test war vielversprechend: ein mit Lazarus erstellter Dreizeiler (commandline- "Programm") an die richtige Stelle auf dem Server meines ISP platziert und die richtigen Datei-Rechte gesetzt, schon kommt die "writeln" Ausgabe des Programms im Browser an, wenn man den richtigen URL ansurft.
Nun möchte ich mit dem FP Programm eine Datei lesen und schreiben. Ein sinnvoller Platz für die Datei wäre vermutlich irgendwo innerhalb des Directories, in dem sich das Programm selbst befindet. Da ein commandline-"Programm" kein "Application" hat bekomme ich das komplett spezifizierte Directory des Programms mit paramstr(0).
Das klappt zumindest auf meinem Suse. Aber auf dem Linux Server des ISP klappt das nicht. Auch wenn ich das Programm nicht per Webserver als CGI, sondern per Telnet starte ist Paramstr(0) ein Leerstring, auch wenn ich mich in einem Directory befinde das in Telnet z.B. /web/cgi-bin heißt und das Programm mit ./test gestartet wird.
Wie kann ich denn den kompletten Pfad meiner Programmdatei ermitteln ?
P.S.: Lazarus bietet als Projekt auch "CGI-Program" an. Gibt es irgenteine Doku, wie man das verwendet ?
-Michael
Beschreibung von TCgiApplication hab ich noch nie gesehen.
Es gibt auch noch das hier
http://z505.com/powtils/docs.shtml" onclick="window.open(this.href);return false;
Es gibt auch noch das hier
http://z505.com/powtils/docs.shtml" onclick="window.open(this.href);return false;
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Ich habe mich gerade sehr Ausführlich mit Lars in der PowUtils User Mailinglist unterhalten und viele interessante Anregungen bekommen. Aber TCGI-Application scheint wie gemacht für den Einstieg in CGI zu sein. Es kann doch nicht sein, dass der Code da 'rumsteht und keiner weiß, was man damit machen kann.
Ist übrigens für mich der einzige gravierende Nachteil von Lazarus gegenüber Delphi. Man kann nicht mit dem Cursor auf einen Begriff gehen und mit Der F1-Taste Hilfe bekommen. (Bei mir kommt immer eine Meldung, dass keine Hilfe verfügbar ist.) Das sollte nicht so bleiben !
-Michael
Ist übrigens für mich der einzige gravierende Nachteil von Lazarus gegenüber Delphi. Man kann nicht mit dem Cursor auf einen Begriff gehen und mit Der F1-Taste Hilfe bekommen. (Bei mir kommt immer eine Meldung, dass keine Hilfe verfügbar ist.) Das sollte nicht so bleiben !
-Michael
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Also viele Sachen sind schon dokumentiert, und es wird täglich mehr. Was Lazarus z.b. nicht macht ist wenn man auf variablennamen F1 drückt die Hilfe des Variablentypes anzuzeigen. Also versuch mal an der stelle wo du F1 Drückst zuerst rechts->Deklaration finden zu drücken und dann dort F1
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
Naja, was wird der Code wohl machen?mschnell hat geschrieben: Es kann doch nicht sein, dass der Code da 'rumsteht und keiner weiß, was man damit machen kann.
CGI ist ja keine Hexerei, bloss ein Commandline Progi mit ein Paar Server und Request Variablen.
Hab's mal kurz getestet. Ist doch nicht sooo schwer:
Code: Alles auswählen
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, cgiapp
{ you can add units after this };
var CGI:TCGIApplication;
L:TStringList;
i:integer;
begin
CGI:=TCGIApplication.create(nil);
CGI.Initialize;
CGI.ContentType:='text/html';
CGI.EmitContentType;
CGI.AddResponseLn('<html><head><title>CGI Test<title></head><body>');
L:=TStringList.Create;
CGI.GetCGIVarList(L);
For i:=0 to L.Count-1 do L[i]:=L[i]+'<br>';
CGI.AddResponse(L.Text);
L.free;
L:=TStringList.Create;
CGI.GetRequestVarList(L);
For i:=0 to L.Count-1 do L[i]:=L[i]+'<br>';
CGI.AddResponse(L.Text);
L.free;
CGI.AddResponseLn('</body></html>');
CGI.free;
end.
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
testcgi.pp habe ich natürlich auch gefunden.
Das nützt mir aber nix, um ein Lazarus-"CGI-Projekt" an's Laufen zu bekommen. Das ist ein "program" und somit ein Lazarus-freies Free-Pascal Programm.
Ein neues "CGI Projekt"in Lazarus macht eine lpr-Datei ähnlich wie ein GUI Projekt. Nur dass kein TForm, sondern ein Datamodule aufgemacht wird. Außerdem wird eine Unit aufgemacht, in die man wohl den Code schreiben soll. Ich glaube kaum, dass es so gedact ist, dass man jede Menge Code in der lpr-Datei (dem "program") ergänzen soll.
Im Endeffekt wird so etwas wie der Code aus testcgi.pp natürlich in der Unit gebraucht. Aber wie kommt man da erstmal hin ? Ich vermute man soll irgendetwas auf dem Datamodul platzieren. Aber was ? Ich finde in der Komponenten-Bibliothek nix mit CGI.
-Michael
Das nützt mir aber nix, um ein Lazarus-"CGI-Projekt" an's Laufen zu bekommen. Das ist ein "program" und somit ein Lazarus-freies Free-Pascal Programm.
Ein neues "CGI Projekt"in Lazarus macht eine lpr-Datei ähnlich wie ein GUI Projekt. Nur dass kein TForm, sondern ein Datamodule aufgemacht wird. Außerdem wird eine Unit aufgemacht, in die man wohl den Code schreiben soll. Ich glaube kaum, dass es so gedact ist, dass man jede Menge Code in der lpr-Datei (dem "program") ergänzen soll.
Im Endeffekt wird so etwas wie der Code aus testcgi.pp natürlich in der Unit gebraucht. Aber wie kommt man da erstmal hin ? Ich vermute man soll irgendetwas auf dem Datamodul platzieren. Aber was ? Ich finde in der Komponenten-Bibliothek nix mit CGI.
-Michael
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Das ist mir schon klar.
Aber ohne jede Art von Dokumentation kann ich ja nicht wissen, wo ich irgendwelchen Code hin schreiben soll. Bei einem "Projekt" (im gegensatz zu einem "Programm") muss das ein Event sein. Aber was für eines ?
Ich in Linux kann ein CGI-Projekt ohne weiteren Code also jede User-Funktionalität) übersetzen (nachdem ich eine doppelte Angabe in "uses entfernt habe). Wenn ich es dann starte, kommt eine Exception namens "Exception". Im Sourcecode sehe ich, dass da offensichtlich irgendwelche vorgaben nicht gesetzt sind, die ich vermutlich in einem vorher aufregufenen Event hätte setzen sollen.
Versuch's 'mal selbst
!
Was nun ?
-Michael
Aber ohne jede Art von Dokumentation kann ich ja nicht wissen, wo ich irgendwelchen Code hin schreiben soll. Bei einem "Projekt" (im gegensatz zu einem "Programm") muss das ein Event sein. Aber was für eines ?
Ich in Linux kann ein CGI-Projekt ohne weiteren Code also jede User-Funktionalität) übersetzen (nachdem ich eine doppelte Angabe in "uses entfernt habe). Wenn ich es dann starte, kommt eine Exception namens "Exception". Im Sourcecode sehe ich, dass da offensichtlich irgendwelche vorgaben nicht gesetzt sind, die ich vermutlich in einem vorher aufregufenen Event hätte setzen sollen.
Versuch's 'mal selbst

Was nun ?
-Michael
Ach so. Hatte ich gar nicht gesehen...mschnell hat geschrieben:testcgi.pp habe ich natürlich auch gefunden.
Ich versteh dein Problem nicht ganz.mschnell hat geschrieben: Das nützt mir aber nix, um ein Lazarus-"CGI-Projekt" an's Laufen zu bekommen. Das ist ein "program" und somit ein Lazarus-freies Free-Pascal Programm.
Die visuellen DB-Komponenten nützen dir bei CGI ja sowieso nichts.
Also warum nicht gleich den DB-Kram auch im Code machen?
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Wenn ich ein konkretes Projekt zu bearbeiten hätte, das irgendwie bald fertig werden muss, würde ich natürlich das "CGI-Projekt" vergessen und alles von Hand in ein "Programm" wie testcgi.pp schreiben.
Da ich aber momentan nur recherchiere, wie man so etwas praktischerweise machen kann, fände ich es sehr schön, einen Test mit dem "CGI-Projekt" zu veranstalten, um zu sehen, wie das funzt. Derjenige der die "CGI-Projekt" Geschichte in Lazarus eingebaut hat, muss sich ja irgendwas dabei gedacht haben. Wäre natürlich nett gewesen, wenn er auch eine Doku dazugeliefert hätte.
Hast Du dazu noch eine Idee ?
-Michael
Da ich aber momentan nur recherchiere, wie man so etwas praktischerweise machen kann, fände ich es sehr schön, einen Test mit dem "CGI-Projekt" zu veranstalten, um zu sehen, wie das funzt. Derjenige der die "CGI-Projekt" Geschichte in Lazarus eingebaut hat, muss sich ja irgendwas dabei gedacht haben. Wäre natürlich nett gewesen, wenn er auch eine Doku dazugeliefert hätte.
Hast Du dazu noch eine Idee ?
-Michael
Das ist schon klar. Wird wohl im Ereignis OnCGIRequest des Datamodule passieren.mschnell hat geschrieben:Was funzt nicht ? Was hast Du denn probiert ? Ich bin ziemlich sicher, dass man irgendwie seine CGI-Funktionen (vermutlich als Events) anmelden muss, bevor das Projekt mit der eigentliche Bearbeitung beginnt.
Aber wie macht man das und wo schreibt man den Code hin ?
-Michael
Nur kriege ich eine Fehlermeldung beim Compilieren:
"Kann CGIDatamodule1 nicht streamen ... Access violation"