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.

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

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 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.

close

Newsletter