2012-09-02 10 views
8

Mam następujący przypadek użycia dla mojego Tornado serwer internetowy:Jak udostępniać dane pomiędzy żądaniami w Tornado Web

Upon POST żąda wpisy mogą być wykonane na serwerze, wpisy, które nie będą utrzymywały się do pliku lub bazy danych . Na żądanie GET proces może zostać rozpoczęty lub zakończony.

Dlatego potrzebuję udostępnić dane między różnymi żądaniami w mojej implementacji RequestHandler. Jaki jest normalny sposób na zrobienie tego?

Miałem problemy z zapisaniem danych do self, na przykład self.entry = "...". W innym wniosku dane nie były już obecne.

Rozwiązanie działa tylko znalazłem jest przechowywanie że w obiekcie aplikacji:

application = web.Application([ 
      (r'.*', MainHandler, 
      ]) 

i

def get(self): 
     # ... 
     self.application.entry = "..." 

Czy to jest właściwy sposób? Co z synchronizacją tutaj, mam na myśli to oznacza dostęp do udostępnionych danych.

Odpowiedz

15

Proponuję następujący: Zamiast dostępu do obiektów bazy danych przekazać obiekt, który przechowuje swoje dane, na przykład:

data = DataStore() 

application = web.Application([ 
     (r'.*', MainHandler, dict(data = data), 
     ]) 

z następującym sposobem RequestHandler inicjalizacji.

def initialize(self, data): 
    self.data = data 

Musisz utworzyć obiekt przed i przekazać go, w przeciwnym razie będzie on odtwarzany za każdym razem, gdy przetwarzane jest żądanie.

+2

Nie jestem zaznajomiony z Tornado, ale pamiętaj, że to prawdopodobnie nie zadziała, jeśli używasz więcej niż jednego procesu. – monkut

+0

@monkut Więcej niż jeden proces do czego, serwer, klient? –

+2

Tornado jest jednoprocesowym, jednowątkowym serwerem ... to zadziała. – oDDsKooL

1

Aplikacja jest odpowiedni obiekt do sklepu (pół-) danych uporczywe. Jednak zgodnie z sugestią innego anwsera należy rozważyć użycie bazy danych do przechowywania tych danych.

Należy jednak uważać, aby sesja (lub transakcja) nie zakończyła się poprawnie (np. Otrzymałeś POST, ale nie pobrano GET, aby uruchomić akcję), powinieneś usunąć dane sesji, aby nie mieć pamięć wycieku serwera WWW.

Z mojego doświadczenia sugeruję używanie Redis, ponieważ jest łatwy w obsłudze i obsługuje key expiration, mechanizm, który przydaje się, gdy trzeba zarządzać danymi sesji.

+0

Dlaczego warto używać bazy danych do przechowywania danych, których nie chcę utrwalać?Dane powinny być dostępne tylko w czasie działania serwera WWW. Jeśli serwer sieciowy ulegnie awarii, dane powinny zostać unieważnione. Jeśli serwer internetowy musi zostać zrestartowany tak, dane powinny zostać unieważnione. – RevMoon

+0

Słyszę cię. Aplikacja jest zdecydowanie najlepszym rozwiązaniem w tej sprawie. Możesz przechowywać dane sesji w dowolnym kontenerze, który Ci się podoba w instancji aplikacji. Moja uwaga była taka, że ​​kiedy/twój projekt będzie się rozwijał, przechowywanie danych sesji w sklepie firm trzecich będzie prawdopodobnie coraz bardziej użyteczne. Pomyślmy na przykład o monitorowaniu aplikacji: może być świetnym rozwiązaniem, aby pobierać/obliczać metryki danych z sesji na żywo ze sklepu (w przeciwieństwie do samego serwera), ponieważ działa on bez zakłócania/obniżania wydajności serwera. – oDDsKooL

6

The documentation daje sposób, aby to zrobić:

class MyHandler(RequestHandler): 
    def initialize(self, database): 
     self.database = database 

    def get(self, username): 
     ... 

mydatabase = dict() 

app = Application([ 
    (r'/user/(.*)', MyHandler, dict(database=mydatabase)), 
    ]) 

Następnie można zapisać swój obiekt mydatabase do pliku.

Ale nie jestem pewien, czy jest to właściwy sposób osiągnięcia tego, co chcesz, jeśli chodzi o synchronizację żądań.

+0

Nie chcę utrwalać moich danych, chcę je tylko zachować podczas pracy. W tym miejscu nie ma potrzeby ani bazy danych. – RevMoon

+0

To co nazywam 'bazą danych' to tylko twoje dane, możesz użyć dowolnego typu przechowywania danych. Pozwala na zapisanie go podczas uruchamiania. – pintoch

Powiązane problemy