Panel informacyjno-kontrolny (#3) – Prezentacja serwisów

Panel informacyjno-kontrolny (#3) - Prezentacja serwisów

Poziom trudności
2/5

Nie ma co ukrywać, tworzenie automatyzacji procesów i paneli do ich przeglądania głównie jest motywowane lenistwem – nie umniejszając oczywiście innym korzyścią z nich płynących. Nic nie daje takiej satysfakcji jak puszczenie testów jednym kliknięciem i wyjściem na kawę. A po powrocie testy (czyli cała „ciężka praca”) czekają na nas już wykonane. A skąd wiemy, że wszystko poszło dobrze? W każdej chwili możemy sprawdzić na stronie np. stan naszych serwisów.

Przekazanie wartości zmiennej z Pythona na stronę

Wykorzystam w tej części, kod z pierwszej części tej serii. Znajdziesz tam też przydatne informacje o tym, jak np. uruchamiać:

Zacznijmy od przekazania zmiennej z pliku app.py wprost na stronę główną. Użyj do tego jednej funkcji Flask’a – render_template(). W przykładzie poniżej, jako template dla panelu wybrałem index.html, ale nazwa strony może być dowolna. Przekazywaną zmienną o nazwie variable jest tekst: „Test text – Hello World v2

  1. from flask import Flask, render_template
  2. app = Flask(__name__)
  3. @app.route("/")
  4. def hello():
  5. return render_template('index.html', variable="Test text - Hello World v2")
  6. if __name__ == "__main__":
  7. app.run(host='0.0.0.0', port=5000)

To jednak nie sprawi, w magiczny sposób, że tekst pojawi się na stronie. Teraz musimy stworzyć plik index.html w odpowiednim miejscu. Najpierw tam, gdzie znajduje się twój plik app.py utwórz folder templates, a następnie w nim plik index.html z poniższą zawartością:

  1. {{variable}}

Jednak dość magicznie ;). Szablon jest renderowany (Flask używa biblioteki szablonów Jinja do renderowania szablonów) z przypisanymi w app.py danymi, tworząc plik końcowy strony internetowej czytelnej dla przelądarek. Teraz po uruchomieniu serwera Flask’a i sprawdzeniu panelu, w przeglądarce ukaże się tekst „Test text – Hello World v2″. Więcej informacji na temat składni i samego Jinja znajduje się w linku poniżej:

Czytanie serwisów za pomocą Pythona

Rozpoczynamy od stworzenia prostej klasy Service, dzięki której będzie można odczytać informacje o dowolnym wybranym serwisie (get_info()), a także zwrócić krótką informację Active lub Inactive, definiującą jego status (is_running()). Klasa Service wykorzystuje bibliotekę wbudowaną os.

  1. import os
  2. class Setrvice:
  3. def __init__(self, service_name):
  4. self.service_name = service_name
  5. self.info_list = str(self.get_info())
  6. def get_info(self):
  7. return os.popen('systemctl status ' + str(self.service_name)).read()
  8. def is_running(self):
  9. return "Acive" if "active (running)" in self.info_list.split('Active:')[1] else "Inactive"

Powyższy kod umieścimy w pliku app.py i użyjemy do sprawdzenia i wyświetlenia statusu zadanego serwisu.

Prezentacja serwisów na stronie

Teraz wystarczy w funkcji hello() zainicjalizować klasę Service. W poniższym przykładzie przypisałem tę inicjalizację do zmiennej flask_service, a następnie wyedytowałem zmienną variable przypisując tekst „App Flask is ” i do niego dodając string z informacją o statusie serwisu.

  1. from flask import Flask, render_template
  2. import os
  3. class Service:
  4. def __init__(self, service_name):
  5. self.service_name = service_name
  6. self.info_list = str(self.get_info())
  7. def get_info(self):
  8. return os.popen('systemctl status ' + str(self.service_name)).read()
  9. def is_running(self):
  10. return "Active" if "active (running)" in self.info_list.split('Active:')[1] else "Inactive"
  11. app = Flask(__name__)
  12. @app.route("/")
  13. def hello():
  14. flask_service = Service("app-flask")
  15. return render_template('index.html', variable="App Flask is " + str(flask_service.is_running()))
  16. if __name__ == "__main__":
  17. app.run(host='0.0.0.0', port=5000)

Teraz po restarcie Flask’a w panelu pojawi się informacja o statusie wybranego serwisu. 

W ten sposób możemy przedstawiać dowolną ilość danych, nie tylko statusów serwisów. Biblioteka os pozwala na wywołanie dowolnej komendy, a co za tym idzie, po uprzednim obrobieniu uzyskanego wyniku, możemy je przedstawić, ale i uruchomić te komendy z poziomu strony internetowej.

Dodaj komentarz