Wbudowany serwer HTTP i wewnętrzny silnik

CherryPy posiada własny serwer WWW (HTTP). Dlatego CherryPy jest samowystarczalny i umożliwia użytkownikom uruchomienie aplikacji CherryPy w ciągu kilku minut od pobrania biblioteki.

Plik web server działa jako brama do aplikacji, za pomocą której śledzone są wszystkie żądania i odpowiedzi.

Aby uruchomić serwer WWW, użytkownik musi wykonać następujące wywołanie -

cherryPy.server.quickstart()

Plik internal engine of CherryPy odpowiada za następujące czynności -

  • Tworzenie i zarządzanie obiektami żądań i odpowiedzi.
  • Kontrolowanie i zarządzanie procesem CherryPy.

CherryPy - Konfiguracja

Framework posiada własny system konfiguracji umożliwiający parametryzację serwera HTTP. Ustawienia konfiguracji mogą być przechowywane w pliku tekstowym o składni zbliżonej do formatu INI lub jako kompletny słownik Pythona.

Aby skonfigurować instancję serwera CherryPy, programista musi użyć globalnej sekcji ustawień.

global_conf = {
   'global': {
      'server.socket_host': 'localhost',
      'server.socket_port': 8080,
   },
}

application_conf = {
   '/style.css': {
      'tools.staticfile.on': True,
      'tools.staticfile.filename': os.path.join(_curdir, 'style.css'),
   }
}

This could be represented in a file like this:
[global]
server.socket_host = "localhost"
server.socket_port = 8080
[/style.css]
tools.staticfile.on = True
tools.staticfile.filename = "/full/path/to.style.css"

Zgodność z HTTP

CherryPy rozwijało się powoli, ale obejmuje kompilację specyfikacji HTTP z obsługą HTTP / 1.0, później przesyłając je z obsługą HTTP / 1.1.

Mówi się, że CherryPy jest warunkowo zgodny z HTTP / 1.1, ponieważ implementuje wszystkie wymagane i wymagane poziomy, ale nie wszystkie wymagane poziomy specyfikacji. Dlatego CherryPy obsługuje następujące funkcje protokołu HTTP / 1.1 -

  • Jeśli klient twierdzi, że obsługuje protokół HTTP / 1.1, musi wysłać pole nagłówka w każdym żądaniu wykonanym przy użyciu określonej wersji protokołu. Jeśli nie zostanie to zrobione, CherryPy natychmiast przerwie przetwarzanie żądania.

  • CherryPy generuje pole nagłówka Date, które jest używane we wszystkich konfiguracjach.

  • CherryPy może obsłużyć kod statusu odpowiedzi (100) przy wsparciu klientów.

  • Wbudowany serwer HTTP CherryPy obsługuje trwałe połączenia, które są domyślne w HTTP / 1.1, poprzez użycie nagłówka Connection: Keep-Alive.

  • CherryPy obsługuje poprawnie podzielone żądania i odpowiedzi.

  • CherryPy obsługuje żądania na dwa różne sposoby - nagłówki If-Modified-Since i If-Unmodified-Since i wysyła odpowiedzi zgodnie z żądaniami.

  • CherryPy dopuszcza każdą metodę HTTP.

  • CherryPy obsługuje kombinacje wersji HTTP między klientem a ustawieniami serwera.

Serwer aplikacji wielowątkowych

CherryPy został zaprojektowany w oparciu o koncepcję wielowątkowości. Za każdym razem, gdy programista pobiera lub ustawia wartość w przestrzeni nazw CherryPy, odbywa się to w środowisku wielowątkowym.

Zarówno cherrypy.request, jak i cherrypy.response to kontenery danych wątków, co oznacza, że ​​aplikacja wywołuje je niezależnie, wiedząc, które żądanie jest przez nie przekazywane w czasie wykonywania.

Serwery aplikacji wykorzystujące wzorzec wątków nie są wysoko cenione, ponieważ użycie wątków jest postrzegane jako zwiększające prawdopodobieństwo problemów związanych z wymaganiami dotyczącymi synchronizacji.

Inne alternatywy obejmują -

Wzorzec wieloprocesowy

Każde żądanie jest obsługiwane przez własny proces w Pythonie. Tutaj wydajność i stabilność serwera można uznać za lepsze.

Wzorzec asynchroniczny

Tutaj akceptacja nowych połączeń i wysyłanie danych z powrotem do klienta odbywa się asynchronicznie z procesu żądania. Ta technika jest znana ze swojej skuteczności.

Wysyłanie adresów URL

Społeczność CherryPy chce być bardziej elastyczna i że inne rozwiązania dla dyspozytorów będą docenione. CherryPy 3 zapewnia inne wbudowane dyspozytory i oferuje prosty sposób pisania i używania własnych dyspozytorów.

  • Aplikacje służące do tworzenia metod HTTP. (POBIERZ, POST, PUT itp.)
  • Ten, który definiuje trasy w adresie URL - Routes Dispatcher

Dyspozytor metod HTTP

W niektórych aplikacjach identyfikatory URI są niezależne od akcji, jaką ma wykonać serwer na zasobie.

Na przykład,http://xyz.com/album/delete/10

Identyfikator URI zawiera operację, którą klient chce wykonać.

Domyślnie dyspozytor CherryPy mapowałby w następujący sposób -

album.delete(12)

Wspomniany wyżej dyspozytor jest wymieniony poprawnie, ale można go uniezależnić w następujący sposób -

http://xyz.com/album/10

Użytkownik może się zastanawiać, w jaki sposób serwer wysyła dokładną stronę. Te informacje są przenoszone przez samo żądanie HTTP. Kiedy pojawia się żądanie od klienta do serwera, CherryPy wygląda na najlepiej dopasowaną procedurę obsługi, procedura jest reprezentacją zasobu, do którego skierowany jest identyfikator URI.

DELETE /album/12 HTTP/1.1

Dyspozytor tras

Oto lista parametrów metody wymaganej przy wysyłce -

  • Parametr name to unikatowa nazwa trasy do połączenia.

  • Trasa jest wzorcem dopasowującym identyfikatory URI.

  • Kontroler to instancja zawierająca programy obsługi stron.

  • Użycie modułu rozsyłającego Routes łączy wzorzec pasujący do identyfikatorów URI i kojarzy określoną procedurę obsługi strony.

Przykład

Weźmy przykład, aby zrozumieć, jak to działa -

import random
import string
import cherrypy

class StringMaker(object):
   @cherrypy.expose
   def index(self):
      return "Hello! How are you?"
   
   @cherrypy.expose
   def generate(self, length=9):
      return ''.join(random.sample(string.hexdigits, int(length)))
		
if __name__ == '__main__':
   cherrypy.quickstart(StringMaker ())

Postępuj zgodnie z instrukcjami podanymi poniżej, aby uzyskać dane wyjściowe powyższego kodu -

Step 1 - Zapisz powyższy plik jako tutRoutes.py.

Step 2 - Odwiedź następujący adres URL -

http://localhost:8080/generate?length=10

Step 3 - Otrzymasz następujący wynik -