Panel informacyjno-kontrolny #3: Prezentacja serwisów
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 skąd wiemy, że wszystko poszło dobrze? W każdej chwili możemy sprawdzić na stronie np. stan naszych serwisów.
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„
from flask import Flask, render_template
app = Flask(__name__)
@app.route("/")
def hello():
return render_template('index.html', variable="Test text - Hello World v2")
if __name__ == "__main__":
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ą:
{{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.
import os
class Setrvice:
def __init__(self, service_name):
self.service_name = service_name
self.info_list = str(self.get_info())
def get_info(self):
return os.popen('systemctl status ' + str(self.service_name)).read()
def is_running(self):
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.
from flask import Flask, render_template
import os
class Service:
def __init__(self, service_name):
self.service_name = service_name
self.info_list = str(self.get_info())
def get_info(self):
return os.popen('systemctl status ' + str(self.service_name)).read()
def is_running(self):
return "Active" if "active (running)" in self.info_list.split('Active:')[1] else "Inactive"
app = Flask(__name__)
@app.route("/")
def hello():
flask_service = Service("app-flask")
return render_template('index.html', variable="App Flask is " + str(flask_service.is_running()))
if __name__ == "__main__":
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.