Pfad/URL response Probleme bei POST request

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

Mittwoch 8. November 2006, 09:20

Hi,

ich hab gerade ein Problem mit der URL Angabe beim
Response eines POST Requests durch ein HTML Formular.

Ich mache das ganze im Moment mit dem BaseHTTPServer
und einem entsprechenden RequestHandler. Habe ich also
z.B. ein Formular mit der ersten Zeile
<form action="." method="post">
kann ich durch die do_POST Methode des RequestHandlers
und dessen "path" und "rfile" Variablen auf Pfad (URL)
und POST Daten zugreifen.

Ja nach Aktion wird z.B. ein neues Objekt in eine DB
eingetragen. Das Rausschreiben des Response z.B. via
send_response(200)
send_header("Content-type", "text/html")
send_header("Content-length", str(len(str(page))))
end_headers()
wfile.write(str(page))
ist ja einfach.

Ich schaffe es aber nicht, den nun angezeigten Pfad im
Browser zu verändern, dass er z.B. einen Pfad (URL) der
Form
"/objects/60"
anzeigt. Im Moment wird bei mir nur
die oben genannte Form Angabe action="." als "/" im Browser
dargestellt. Mach ich das über das environment, headers,
html-page, ... :roll: ???

Tabellar

PS:
Ich weiss, dass es WSGI gibt. Allerdings möchte ich die
Sache mit der Pfaddefinition (URL Scheme) erst mal mit dem
BaseHTTPServer verstehen...
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 8. November 2006, 10:51

Das ganze funktioniert IMHO nur, wenn du vollen Zugriff auf dem WebServer hast. Wenn du einen Directory-Handler (Weiß jetzt spontan nicht wie es genau heißt) in Apache definieren kannst... Also das man sagen kann, alle URL Anfragen sollen mit meinem Skript beantwortet werden.
In der freien Wildbahn (SharedWebhosting) hat man IMHO nicht diese Möglichkeit.

In PyLucid mache ich das so, das jede anfrage an die index.py gestellt wird und danach kommt ein Pseudopfad. Also z.B. so:
jensdiemer.de/index.py/_command/StringFight/fight/

Hast du also vollen zugriff, machst du halt nicht form action="." sondern form action="/objects/60". Wenn dieser Zielpfad erst dann feststeht, wenn der POST abgeschickt wurde, dann gibt es IMHO zwei Möglichkeiten:
1. So wie phpBB macht: Es kommt eine zwischen Seite ala "Neuer Beitrag erstellt..." Dann eine Weiterleitung zum Beitrag mit der URL...
2. Eine zwischen Seite macht "unbemerkt" die Weiterleitung auf die neue URL mit HTTP-HeaderLocation (Oder wie das heißt)
3. Die WebApp macht es ganz anders, wie z.B. PyLucid ;)

Ich meine Pocoo macht IMHO ersteres...

Ich fand diese Möglichkeit doof und arbeite in PyLucid mit meinen "Page-Messages"... d.h. es kommt direkt die "Zielseite" mit der URL und in der Seite kommt die Info, das die Aktion ausgeführt wurde... z.B. Wenn du mein StringFight Formular leer wegschickst, dann bekommst du ein Page-Message: "Form error!" oder wenn du zu kurze Strings vergleichen willst, wird "Given Strings are to short!" in die Seite "eingeblendet".

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

Mittwoch 8. November 2006, 13:37

@Jens:
Danke für die Tipps! Mit den Stichwörtern bin ich weitergekommen.

Das Thema hierzu sind "redirects" :oops: und HTTP-Status-Codes.
Mit dem Status Code 301 (Moved Permanently) kann man die URL
Umleitung erwirken. Nachfolgender Code reicht völlig aus

Code: Alles auswählen

self.rqh.send_response(301)
self.rqh.send_header("Location", "/objects/60")
self.rqh.end_headers()
Grüsse
Tabellar :)
Antworten