Zwei neue Kapitel sind dazu gekommen:
- Was wird von CherryPy bei welchem URL ausgeliefert?
- Bilder und andere statische Dateien
http://halvar.at/python/cherrypy_cheetah/
lg
Gerold

Edit: Links ausgebessert
Hm das schlechte am Referer prüfen ist das es idiotische "Fi0rW4llz" und ähnliches gibt welche den Referer einfach löschen. Da Frage ich mich ernsthaft warum sie nicht überprüfen ob Referer != Host und ihn nur dann löschen. Wobei ich für mich persönlich denke das jeder der sowas Benutzt selber schuld ist und man ihn ruhig darauf aufmerksam machen soll. Kunden sind da oft anderer Meinung.Leonidas hat geschrieben:Richtig, deswegen muss man auch den Referer prüfen, ob der POST auch von "deiner" seite kommt und nicht von wo anders. Aber wenn wir das Beispiel von fme nehmen, dann kann dem User kein POST aus einem Link im Profil untergeschoben werden. Und wenn daten per POST kommen, muss man eben Referer prüfen.
GET und POST sind zwei verschiedene Dinge, wieso sollte man sie gleich behandeln? Eine GET Anfrage sollte zum Beispiel keine Nebeneffekte haben.Gerold hat geschrieben: Ich halte nicht sehr viel von der Trennung zwischen GET und POST.
Die noch böseren Jungs hängen so etwas wiethelittlebug hat geschrieben:Bei Browsergames ist es sehr beliebt in den Foren oder im IRC mal Nachrichten wie die hier loszulassen: Hier eine Möglichkeit zu cheaten, klicke einfach auf http://www.unsertollesbrowsergame.de/us ... ion=delete
Das schlimme dabei, es geht bei 95% der Browsergames
Code: Alles auswählen
[img]http://example.com/account.php?action=delete[/img]
Hallo veers!veers hat geschrieben:GET und POST sind zwei verschiedene Dinge, wieso sollte man sie gleich behandeln? Eine GET Anfrage sollte zum Beispiel keine Nebeneffekte haben.
Code: Alles auswählen
http://example.com/account.php?action=delete
Ich bin der Meinung man muß bei einem Client-Request nicht zwischen GET und POST auf dem Server unterscheiden. Da sehe ich eigentlich keine Notwendigkeit.gerold hat geschrieben:Also ganz habe ich es noch nicht verstanden, warum ich zwischen GET und POST unterscheiden sollte.
Hallo!jens hat geschrieben:Allerdings sollte man bei Navigation/Formulare gezielt POST oder GET benutzten.
Code: Alles auswählen
<a href="http://example.com/artikelliste.html?from_id=100&to_id=199">Next 100 Articles</a>
Code: Alles auswählen
http://example.com/account.php?action=delete
Was Include-Mechanismen oder Macros angeht bin ich persönlich mit dem TAL/TALES/METAL-Gespann (genutzt über das SimpleTAL-Paket) ins Straucheln gekommen und konnte mich nicht einfach in die Möglichkeiten der Wiederverwendung hineindenken. Dass sowas anderen nicht einfach beizubringen ist, kann ich mir gut vorstellen.gerold hat geschrieben: Genshi war ziemlich weit oben in meiner Rangliste. Ich konnte mich nur nicht in die Umgekehrte Reihenfolge der Code-Wiederverwendung eindenken. Mit TAL/METAL ruft man von jeder TAL-Seite aus das Makro der Hauptseite auf und füllt "Slots" mit den geänderten Daten. Bei Genshi scheint es genau umgekehrt zu funktionieren. Man arbeitet ständig mit der Hauptvorlage und ändert die Incluces je nach anzuzeigender Seite. Zumindest wurde es mir in den paar Stunden, die ich Genshi gewidmet hatte, so vermittelt.
Ich habe auf die Schnelle kein gutes Beispiel gefunden und da es sich, wie oben schon erwähnt, (für mich) ungewohnt anfühlte, habe ich es nicht mehr weiter bedacht. Dann kommt noch dazu, dass ich mindestens schon fünf Designern/Grafikern/Freunden TAL/METAL beibringen wollt und nicht ein einziger ist mir darauf eingestiegen. (mir wäre es mit Genshi wohl kaum besser ergangen) Nur ein Kollege von mir (ein Administrator) kommt damit klar. Er hilft mir jetzt öfter mal bei Zope-Websites. Als ich letztens einem meiner Kollegen Cheetah zeigte, war alles nach ein paar Minuten klar. Sogar ``#for`` und ``#if`` wurde sofort verstanden. Ich musste nichts erklären. Es erklärte sich (fast) alles von selbst. Das ist wahrscheinlich der Grund dafür gewesen, warum ich bei Cheetah geblieben bin.
Das ist ja gerade das Problem beim CSRF, du bist authentifiziert, und ich bin in der Lage von aussehn Befehle im Scope deiner Session auszuführen.gerold hat geschrieben:Wobei ich glaube, dass man jegliche Änderung auf einer Website nur dann zulassen sollte, wenn der Benutzer authentifiziert ist.
Redirectgerold hat geschrieben:Da finde ich GET sogar noch besser, da man hier schon am URL erkennt, dass etwas passiert, was ich evt. nicht will.
Erwischt!veers hat geschrieben:Redirectgerold hat geschrieben:Da finde ich GET sogar noch besser, da man hier schon am URL erkennt, dass etwas passiert, was ich evt. nicht will.
Wenn ich z.B. Bilder in einer HTML-Seite verwende, die nur in diese eine Seite gehören, dann speichere ich die Bilder dieser HTML-Seite in den gleichen Ordner, in dem auch die HTML-Seite gespeichert ist. Ich habe mir angewöhnt, den meisten HTML-Seiten einen eigenen Ordner im Dateisystem zu gönnen. So habe ich immer eine abgeschlossene Einheit für sich. Eine HTML-Seite mit allen zugehörigen Bildern. Will ich diese Seite los werden, dann lösche ich diesen Ordner mit all seinen Bildern. Möchte ich die HTML-Seite unter einem anderen URL zur Verfügung stellen, dann verschiebe ich den Ordner mit all seinen Bildern.snatch hat geschrieben:In der INI Datei hast du reale Ordner für css und images festgelegt. Das ist logisch, aber was ist mit Ordnern wie "my1stsubdir" o. "my2ndsubdir"? Ich habe es bisher nämlich so verstanden das die Ordnerstruktur aus der URL auf Klassen und Funktionen zurück zu führen ist und nicht auf reale Ordner. Ist es in dem Fall möglich über die URL auf diese realen Ordner zuzugreifen oder passiert das gar nicht über die URL?
Wie und wofür nutzt du die realen Ordner?
CherryPy basiert auf WSGI und das ist ein Standard der es ermöglicht, die Anwendung entweder als eigenständigen Server oder auch hinter einem Apachen oder Lighttpd laufen zu lassen.snatch hat geschrieben:wie und ob es möglich ist CherryPy hinter einem Apache oder Lighttpd Server zu nutzen?
Mehrere Dateien zu benutzen, bringt nur dann einen Vorteil, wenn du mit anderen Python-Modulen interagieren musst. Wenn das nicht der Fall ist, dann verkompliziert jede zusätzliche Datei dein Programm ohne weiteren Zusatznutzen.snatch hat geschrieben:Du hast bisher immer alle Klassen in einer Datei dargestellt. Natürlich ist es in einem Tutorial einfacher für die Darstellung oder ist das so Standart bei CherryPy das alles in einer Datei gespeichert wird?
Wobei mod_wsgi ähnliche Designfehler wie mod_python hat, zumindest der 'embedded mode'. Den Interpreter im Apache-Prozess (oder überhaupt im HTTPd-Prozess) laufen lassen ist Aufgrund der Eigenschaften des Python-Interpreters nicht anzuraten. Letztendlich bleibt der 'daemon mode', der zwar weniger Setup benötigt als FastCGI/SCGI, aber im Gegensatz zu diesen fest an Apache gekoppelt ist. Besser als mod_python ist es schon und vielleicht wird es ja besser betreut als Apaches FastCGI Module. Ansonsten sollte man erstmal abwägen, was man benötigt.gerold hat geschrieben:CherryPy basiert auf WSGI und das ist ein Standard der es ermöglicht, die Anwendung entweder als eigenständigen Server oder auch hinter einem Apachen oder Lighttpd laufen zu lassen.snatch hat geschrieben:wie und ob es möglich ist CherryPy hinter einem Apache oder Lighttpd Server zu nutzen?
- http://www.cherrypy.org/wiki/WSGI
- http://projects.amor.org/misc/wiki/ModPythonGateway
- http://code.google.com/p/modwsgi/wiki/I ... thCherryPy
Hallo snatch!snatch hat geschrieben:wie ist das wenn man keine Funktion dafür schreibt? Ich gehe davon aus das man dann einen Error bekommt das die jeweilige Funktion nicht vorhanden ist.
Hallo EnTeQuAk!EnTeQuAk hat geschrieben:Was mich allerdings interessiert, ist die Möglichkeit eines eigenen Dispatchers, für meine Applikation, da ich gerne meine Applikationen etwas anders aufbauen möchte, als mir der aktuelle es zulässt.
Code: Alles auswählen
#-*- coding: utf-8 -*-
import cherrypy
from werkzeug import routing
from wwws.views import all_views
from wwws.urls import url_map
class WWWSDispatcher(object):
"""
Because we don't use the default
dispatcher this will be the real
internal application.
"""
def __init__(self):
self.url_map = url_map
self._views = all_views.copy()
def get_view(self, endpoint):
return self._views[endpoint]
def __call__(self, path_info):
req = cherrypy.request
print dir(req)
url_adapter = self.url_map.bind_to_environ(req.wsgi_environ)
try:
endpoint, args = url_adapter.match(path_info)
except routing.NotFound:
req.handler = cherrypy.NotFound()
except routing.RequestRedirect, e:
req.handler = cherrypy.HTTPRedirect()
else:
view = cherrypy.dispatch.LateParamPageHandler(
self.get_view(endpoint))
req.handler = view
#: set the request config
req.config = cherrypy.config.copy()
#: It's not needed from cherrypy but we also return
#: the page handler object.
return req.handler
Code: Alles auswählen
class Application(object):
_cp_conf = {'request.dispatcher': WWWSDispatcher(),
'tools.trailing_slash.on': False,
'tools.wsgiapp.on': True,
}