cherrypy wsgiserver probleme

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Volvic
User
Beiträge: 30
Registriert: Donnerstag 14. Juni 2007, 05:18

hallo,

zuerst der code:

Code: Alles auswählen

import wsgiserver
import rfc822
import os
import string
import threading

def res_router(environ, start_response):
	if environ['REQUEST_METHOD'] == 'GET':
		if environ['PATH_INFO'] in CACHED_FILES:
			tmp = CACHED_FILES[environ['PATH_INFO']]
			status = '200 OK'
			response_headers = [('Content-type', CACHED_MIMETYPE[environ['PATH_INFO']])]
		else:
			tmp = 'ERROR: 404 - Not Found'
			status = '404 Not Found'
			response_headers = [('Content-type', 'text/html')]
	elif environ['REQUEST_METHOD'] == 'POST':
		pass
	start_response(status, response_headers)
	return [tmp]

wsgi_apps = [('/home', app_home), ('', res_router)]
server = wsgiserver.CherryPyWSGIServer(('localhost', 8080), wsgi_apps, server_name='Ludmilla', request_queue_size=50)
if __name__ == '__main__':
	try:
		server.start()
	except KeyboardInterrupt:
		print 'Normal Shutdown...'
		server.stop()
mein problem ist das wenn ein request reinkommt zwar alles wunderbar funktioniert, nur werden selbst bilder oder .flv dateien ständig neugeladen, und das ist wirklich unnütze traffic verschwendung. bei dynamischen seiten ist es ja logisch aber bei bildern die sich sehr selten ändern ist es unnütze sie bei jedem request neu zu senden.
wie kann ich dieses problem "beheben"? oder würde es sin machen einen apache davor zu stellen, also würde dieser das automatisch regulieren?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Über die Last-Modified-Header sollte sowas verhindert werden. Vielleicht ist es nicht aktiviert oder implementiert, was ich mir beides nicht vorstellen kann. Ein Apache oder anderer guter HTTPd davor als Frontend sollte das aber richtig machen und ist ohnehin eine gute Wahl, da optimierter als ein primär für Python-Web-Applikationen geschriebener Server.
Volvic
User
Beiträge: 30
Registriert: Donnerstag 14. Juni 2007, 05:18

wow, danke für die sehr fixe antwort :)

wenn ich wsgi richtig verstehe habe ich somit ja eben jetzt ein plus und kann einfach nen richtigen httpd davorstellen. wie muss ich das ganze anbinden?
aus dem forum habe ich für mich flup entdeckt, ich müsste also eigentlich lediglich den code:

Code: Alles auswählen

wsgi_apps = [('/home', app_home), ('', res_router)]
server = wsgiserver.CherryPyWSGIServer(('localhost', 8080), wsgi_apps, server_name='Ludmilla', request_queue_size=50)
if __name__ == '__main__':
	try:
		server.start()
	except KeyboardInterrupt:
		print 'Normal Shutdown...'
		server.stop()
durch den passend flup (z.b. SCGI) wsgiserver ersetzen und alles würde wenn ich mich nach dem wsgi standard (also z.b. bei der funktion res_router() ?) halte weiterhin funktionieren?
Volvic
User
Beiträge: 30
Registriert: Donnerstag 14. Juni 2007, 05:18

nachtrag: Last-Modified hilt nicht wirklich... es werden trotzdem alle sachen neugeladen, jedesmal :-/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Volvic hat geschrieben:nur werden selbst bilder oder .flv dateien ständig neugeladen
Hallo Volvic!

Wenn du Bilder und anderen statischen Content von Cherrypy ausliefern lässt -- und damit meine ich jetzt nicht irgendeine selbstgestrickte Lösung -- dann wird von CherryPy automatisch Last-Modified im Header mitgeschickt. Das ist schon einmal ein Anfang und Firefox hält Bilder im lokalen Cache. Außer du klickst auf den Refresh-Button. Dann wird natürlich wieder alles vom Server geholt.

Das Caching-Verhalten kann man aber noch viel genauer steuern. Dafür gibt es eigene Header-Felder. Das ist auch interessant, um das Verhalten von Proxies zu steuern.

Lektüre:
- http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
- http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Das Anhängen von diesen Header-Feldern kann man recht einfach über Tools http://www.cherrypy.org/wiki/CustomTools erledigen, die man z.B. als "before_finalize hook" in die Verarbeitung einhängt. Der Verarbeitungsablauf wird hier aufgezeigt: http://www.cherrypy.org/wiki/RequestObject

Du kannst CherryPy auch daran hindern, dynamische Seiten eine gewisse Zeit lang neu zu generieren, indem du das Memory-Caching einsetzt. Siehe: http://www.cherrypy.org/wiki/Caching

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten