CherryPy

Kurs i wprowadzenie do mini-frameworka, serwera HTTP CherryPy umożliwiającego tworzenie i hostowanie stron internetowych napisanych w Pythonie

CherryPy to framework do tworzenia serwisów www i serwer w jednym. Jest prosty, wydajny i łatwy w nauce :) Nie jest to pełen framework MVC lecz mimo to sporo można w nim zrobić. CherryPy jest elementem większego frameworka - TurboGears. Z drugiej strony CherryPy uważane jest przez część środowiska za projekt niedojżały do zastosowań produkcyjnych (zmienność API, błędy).

Hello World wygląda następująco:
import cherrypy

class HelloWorld:
    def index(self):
        return "Hello world!"
    index.exposed = True

cherrypy.root = HelloWorld()
cherrypy.server.start()
Uruchamiamy skrypt i kierujemy przeglądarkę pod adres http://localhost:8080/. Tworzymy klasę HelloWorld, którą później przypiszemy cherrypy. Metoda index odpowiada za główną stronę, dla adresu http://localhost:8080/strona przypisana będzie metoda "strona", dla http://localhost:8080/strona/jakas - "strona.jakas". Ważnym elementem jest index.exposed = True (nazwa_metody.exposed = True). Tylko metody "otwarte" mogą być wywoływane przez serwer cherrypy.:
import cherrypy

class HelloWorld:
	def index(self):
		return 'strona główna'
	def foo(self):
		return 'Podstrona foo'
	index.exposed = True
	foo.exposed = True

cherrypy.root = HelloWorld()
cherrypy.server.start()
http://localhost:8080/ wyświetli główną stronę (równoznaczne z http://localhost:8080/index) a http://localhost:8080/foo podstronę "foo" :)

Obsługa formularzy jest dość prosta:
import cherrypy

class HelloWorld:
	def index(self, nazwapola=None):
		if(nazwapola == None):
			return """<form action="index" method="post">
			<p>Pole</p>
			<input type="text" name="nazwapola" value="" size="15" maxlength="40"/>
			<p><input type="submit" value="Wyslij"/></p>
			</form>"""
		else:
			return "Wpisales: " + nazwapola
	index.exposed = True

cherrypy.root = HelloWorld()
cherrypy.server.start()
Metody mogą przyjmować dodatkowe parametry o nazwach odpowiadających nazwom pól z formularza. Zmienne podane w definicji metody muszą mieć przypisaną domyślną wartość. Powyższy kod wyświetla prosty formularz. Po wysłaniu formularza wyświetli wpisaną w polu wartość.
Zmienne można też przesyłać poprzez link korzystając z niepełnego przypisania:
import cherrypy

class HelloWorld:
	def index(self, nazwapola=None):
		if(nazwapola == None):
			return """<form action="index" method="post">
			<p>Pole</p>
			<input type="text" name="nazwapola" value="" size="15" maxlength="40"/>
			<p><input type="submit" value="Wyslij"/></p>
			</form>"""
		else:
			return "Wpisales: " + nazwapola
	def default(self, zmienna1, zmienna2):
		return "Zmienna1 to: " + zmienna1 + ", a zmienna2 to: " + zmienna2
	index.exposed = True
	default.exposed = True

cherrypy.root = HelloWorld()
cherrypy.server.start()
Pod adresem http://localhost:8080/index zobaczymy nasz znany formularz, lecz pod adresem http://localhost:8080/foo/bar pojawi się "Zmienna1 to: foo, a zmienna2 to: bar" cherrypy zanim wywali komunikat o braku metody dla podanego adresu wywołuje metodę default (jeżeli jest zdefiniowana). Przykład widzimy powyżej. Jeżeli chcemy wykorzystać niepełne przypisanie dla jakiejś podstrony to musimy utworzyć dodatkową klasę z metodą default i po cherrpy.root = HelloWorld dać cherrypy.root.podstrona = ExtraKlasa()

Cherrypy może korzystać z pliku konfiguracyjnego. Wystarczy wskazać plik konfiguracyjny dodając przed cherrypy.server.start():
cherrypy.config.update(file="nazwa_pliku_konfiguracyjnego")
Podstawowe dane jakie możemy wprowadzić do pliku konfiguracyjnego to:
[global]
server.socketPort = 8000
server.threadPool = 10
sessionFilter.on = True
staticFilter.root = "/home/site"

[/static]
staticFilter.on = True
staticFilter.dir = "static"
server.socketPort - określa port na jakim ma pracować cherrypy
server.threadPool - określa liczbę nagłówką uruchamianych przez CherryPy
staticFilter.root - określa położenie statycznych elementów (grafika, pliki html itd.)
Można też uruchomić filtry CherryPy, np. dodanie:
[/]
encodingFilter.on = True
gzipFilter.on = True
Uruchomi kompresję gzip wysyłanych stron co zmniejszy transfer.
blog comments powered by Disqus

Kategorie

Strony