Non-Message Queue / Simple Long-Polling in Python (and Flask)

Szukam prostego (tj. Nie takiego, który wymaga ode mnie skonfigurowania oddzielnego serwera do obsługi kolejki wiadomości) sposobu na długie sondowanie dla małego interfejsu internetowego, który uruchamia obliczenia i tworzy wykres. To jest to, co mój interfejs internetowy musi zrobić:

  1. użytkownik żąda wykresu / danych w interfejsie WWW
  2. serwer wykonuje pewne obliczenia.
  3. podczas wykonywania obliczeń na serwerze, mały kontener jest aktualizowany (prawdopodobnie przez AJAX / jQuery) z obliczeniami postęp (podobny do tego, co można zrobić w konsoli z print (tj. print ' obliczanie funkcji gęstości...'))
  4. Obliczanie kończy się i wykres jest wyświetlany użytkownikowi.

Ponieważ obliczenia są wykonywane po stronie serwera, nie jestem pewien, jak łatwo to skonfigurować. Oczywiście będę chciał skonfigurować REST API do obsługi ankiety, co byłoby łatwe w Flask. Jednak nie jestem pewien, jak odzyskać rzeczywiste aktualizacje. Oczywistym, choć skomplikowanym w tym celu rozwiązaniem byłoby Ustaw kolejkę wiadomości i wykonaj długie ankiety. Jednak nie jestem pewien, czy jest to właściwe podejście do czegoś tak prostego.

Oto moje pytania:

  1. czy istnieje sposób, aby to zrobić za pomocą systemu plików? Wydajność nie jest wielkim problemem. Czy AJAX / jQuery może znaleźć wiadomości z pliku? Zapisz postęp do niektórych .plik json?
  2. A co z marynowaniem? (Nie wiem za wiele o marynowaniu, ale może uda mi się wytrawić dict wiadomości i można by ją odczytać przez API, które jest obsługa ankiet). Czy sondaż jest w ogóle dobrym podejściem? Czy istnieje lepszy lub bardziej powszechny wzorzec, aby sobie z tym poradzić?

Mam wrażenie, że przesadzam, bo wiem, że tego typu rzeczy są powszechne w sieci. Dość często widzę coś się dzieje i trochę " ładowania.obraz gif " jest uruchamiany podczas niektórych obliczeń (na przykład w Google Analytics).

Dzięki za pomoc!

Author: aaronlevin, 2012-06-22

2 answers

Zbudowałem kilka takich aplikacji używając tylko Flask i jQuery. Bazując na tym doświadczeniu, powiedziałbym, że twój plan jest dobry.

  1. Nie używaj systemu plików. pojawią się problemy/zabezpieczenia JavaScript. W mało prawdopodobnym przypadku, gdy znajdziesz rozsądne obejścia, nadal nie będziesz mieć niczego przenośnego lub skalowalnego. Zamiast tego użyj małego lokalnego frameworka służącego do obsługi sieci web, takiego jak Flask.

  2. Nie marynuj. użyj JSON. To język aplikacji internetowych oraz interfejsy REST. jQuery i te ładne wtyczki oparte na jQuery do rysowania wykresów, wykresów i takich będą oczekiwały JSON. Jest łatwy w użyciu, czytelny dla człowieka, a w przypadku małych aplikacji nie ma powodu, aby iść w inne miejsce.

  3. Długa ankieta jest dobra dla tego, co chcesz osiągnąć. czyste aplikacje oparte na HTTP mają pewne ograniczenia. I WebSockets i podobnych warstw socket-owskich jak Socket.IO " są przyszłością."Ale znalezienie dobrych, prostych przykładów implementacji po stronie serwera ma, z doświadczenia wiem, że to było trudne. Szukałem ciężej. Istnieje wiele przykładów, które wymagają skonfigurowania węzła.js, REDIS i inne elementy middleware. Ale dlaczego mamy skonfigurować dwa lub trzy oddzielne serwery middleware? To niedorzeczne. Tak długo-ankieta na prosty, czysty-Python Web framework jak Flask jest sposobem, aby przejść IMO.

Kod jest trochę więcej niż fragmentem, więc zamiast go tutaj umieszczać, umieściłem uproszczony przykład w repozytorium Mercurial na bitbucket , który możesz dowolnie przeglądać, kopiować lub klonować. Istnieją trzy części:

  • serve.py serwer oparty na Pythonie / Flasku
  • templates/index.html 98% HTML, 2% plik szablonu serwer oparty na Flask będzie renderował jako HTML
  • static/lpoll.js klient oparty na jQuery
 40
Author: Jonathan Eunice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-22 18:13:30

[1]}Long-polling był rozsądnym obejściem, zanim proste, naturalne wsparcie dla gniazd internetowych pojawiło się w większości przeglądarek i zanim zostało łatwo zintegrowane z aplikacjami Flask. Ale tutaj w połowie 2013 r. obsługa gniazd internetowych przeszła długą drogę.

Oto przykład , podobny do powyższego, ale integrujący gniazda Flask i Web. Działa na komponentach serwera z gevent i gevent-websocket .

Uwaga Ten przykład nie jest przeznaczony do gniazda sieciowego arcydzieło. Zachowuje wiele struktury lpoll, aby ułatwić ich porównywalność. Ale natychmiast poprawia responsywność, obciążenie serwera i interaktywność aplikacji internetowej.

 10
Author: Jonathan Eunice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 01:36:27