#!/usr/bin/python from flask import Flask, render_template, jsonify, request import datetime from flask.wrappers import Request import redis import socket from werkzeug.utils import redirect #create a socket object s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #connect to the server on local computer s.connect(("8.8.8.8", 80)) #assegno a variabile indirizzo ip per usi futuri ipv4 = s.getsockname()[0] s.close() #volendo stampo a video IPv4 #print("Indirizzo Ipv4 assegnato: ",s.getsockname()[0]) #configurazione per lavorare su server redis locale REDIS_PORT = 6379 REDIS_HOST = '127.0.0.1' redSrv0 = redis.Redis( host=REDIS_HOST, port=REDIS_PORT, db=0) flaskApp = Flask(__name__) @flaskApp.route("/") #funzione main: passa al template home il titolo def main(): channelsData = { 'title' : 'Home' } #assegno il template html di riferimento return render_template('home.html', **channelsData) @flaskApp.route("/logger") #funzione logger, route a pagina /logger def logger(): channelsData = { 'title' : 'Logger', 'timeSrv' : redSrv0.get('RTDATA:TIME:SRV').decode('utf-8'), 'timeLog' : redSrv0.get('RTDATA:TIME:LOG').decode('utf-8'), 'Freq' : redSrv0.get('SETTINGS:LOG:FREQ').decode('utf-8'), 'Ch0' : redSrv0.get('RTDATA:CH:0').decode('utf-8'), 'Ch1' : redSrv0.get('RTDATA:CH:1').decode('utf-8'), 'Ch2' : redSrv0.get('RTDATA:CH:2').decode('utf-8'), 'Ch3' : redSrv0.get('RTDATA:CH:3').decode('utf-8'), 'Ch4' : redSrv0.get('RTDATA:CH:4').decode('utf-8'), 'Ch5' : redSrv0.get('RTDATA:CH:5').decode('utf-8'), 'Ch6' : redSrv0.get('RTDATA:CH:6').decode('utf-8'), 'Ch7' : redSrv0.get('RTDATA:CH:7').decode('utf-8') } #assegno il template html di riferimento return render_template('logger.html', **channelsData) @flaskApp.route("/settings") #funzione setup, route a pagina /setup def setup(): channelsData = { 'title' : 'Settings', 'Freq' : redSrv0.get('SETTINGS:LOG:FREQ').decode('utf-8') } #assegno il template html di riferimento return render_template('settings.html', **channelsData) @flaskApp.route("/about") #funzione about, route a pagina /about def about(): channelsData = { 'title' : 'About' } #assegno il template html di riferimento return render_template('about.html', **channelsData) # definisco una NUOVA route a cui rispondere su chiamta in metodo GET x restituire dati aggiornati @flaskApp.route("/api/v1/channels/all", methods=['GET']) def api_channels_all(): numCh = redSrv0.get('SETTINGS:SELECTED_CH').decode('utf-8') #funzione api_channels_all: legge direttamente da redis, ritorna jsonify channelsData = { 'timeSrv' : redSrv0.get('RTDATA:TIME:SRV').decode('utf-8'), 'timeLog' : redSrv0.get('RTDATA:TIME:LOG').decode('utf-8'), 'Freq' : redSrv0.get('SETTINGS:LOG:FREQ').decode('utf-8'), 'Ch0' : redSrv0.get('RTDATA:CH:0').decode('utf-8'), 'Ch1' : redSrv0.get('RTDATA:CH:1').decode('utf-8'), 'Ch2' : redSrv0.get('RTDATA:CH:2').decode('utf-8'), 'Ch3' : redSrv0.get('RTDATA:CH:3').decode('utf-8'), 'Ch4' : redSrv0.get('RTDATA:CH:4').decode('utf-8'), 'Ch5' : redSrv0.get('RTDATA:CH:5').decode('utf-8'), 'Ch6' : redSrv0.get('RTDATA:CH:6').decode('utf-8'), 'Ch7' : redSrv0.get('RTDATA:CH:7').decode('utf-8'), 'ChScaleMax' : redSrv0.get('SETTINGS:IN:MAX:'+str(numCh)).decode('utf-8'), 'ChScaleMin' : redSrv0.get('SETTINGS:IN:MIN:'+str(numCh)).decode('utf-8'), 'ChRealMax' : redSrv0.get('SETTINGS:OUT:MAX:'+str(numCh)).decode('utf-8'), 'ChRealMin' : redSrv0.get('SETTINGS:OUT:MIN:'+str(numCh)).decode('utf-8') } # restituisce in formato json i dati letti da redis return jsonify(channelsData) # Route di comando x LOG: start e stop @flaskApp.route("/api/v1/log/start", methods=['PUT']) def start_log(): #funzione start_log: scrive su redis LOG:STATUS -> 1 redSrv0.set('SETTINGS:LOG:STATUS', 1) return "OK" @flaskApp.route("/api/v1/log/stop", methods=['PUT']) def stop_log(): #funzione stop_log: scrive su redis LOG:STATUS -> 0 redSrv0.set('SETTINGS:LOG:STATUS', 0) return "OK" @flaskApp.route("/api/v1/setup/saveInMin", methods=['PUT']) def setupInMin(): # devo leggere il channel attualmente selezionato indCh = redSrv0.get('SETTINGS:SELECTED_CH').decode('utf-8') currChVal = redSrv0.get('RTDATA:CH:'+ str(indCh)) redSrv0.set('SETTINGS:IN:MIN:'+ str(indCh), currChVal) return redirect("/settings") @flaskApp.route("/api/v1/setup/saveInMax", methods=['PUT']) def setupInMax(): # devo leggere il channel attualmente selezionato indCh = redSrv0.get('SETTINGS:SELECTED_CH').decode('utf-8') currChVal = redSrv0.get('RTDATA:CH:'+ str(indCh)) redSrv0.set('SETTINGS:IN:MAX:'+ str(indCh), currChVal) return redirect("/settings") @flaskApp.route("/api/v1/setup/selectChannel/", methods=['PUT']) def selectChannel(numCh): print(numCh) # request_data = request.get_json() # # devo leggere il channel attualmente selezionato, x ora cablo a 0... # numCh = request_data['channel'] redSrv0.set('SETTINGS:SELECTED_CH', numCh) return "OK" @flaskApp.route("/api/v1/sessions", methods=['POST']) def sessionCreate(): #funzione creazione sessione: scrive su redis SESSION:NAME prendendolo dall'input in pagina html con nome NewSessionName sessionName = request.form['NewSessionName'] redSrv0.set('RTDATA:SESSION:NAME', sessionName) # rimando in logger return redirect("/logger") @flaskApp.route("/api/v1/frequency", methods=['POST']) def setFrequency(): #funzione set frequenza scrive su redis LOG:FREQ prendendolo dall'input in pagina html con nome LogFreq newFrequency = request.form['LogFreq'] redSrv0.set('SETTINGS:LOG:FREQ', newFrequency) # rimando in settings return redirect("/settings") @flaskApp.route("/api/v1/scaleout", methods=['POST']) def setScale(): indexCh = redSrv0.get('SETTINGS:SELECTED_CH').decode('utf-8') scaleMin = request.form['ScaleMin'] redSrv0.set('SETTINGS:OUT:MIN:'+ str(indexCh), scaleMin) scaleMax = request.form['ScaleMax'] redSrv0.set('SETTINGS:OUT:MAX:'+ str(indexCh), scaleMax) # rimando in settings return redirect("/settings") #dichiaro host ipv4 (ottenuto sopra utilizzando il modulo socket) if __name__ == "__main__": flaskApp.run(host=ipv4, port=80, debug=True)