Python Variabel im Branca-Template anzeigen

Django, Flask, Bottle, WSGI, CGI…
Antworten
chilltok
User
Beiträge: 3
Registriert: Freitag 1. Mai 2020, 17:38

Hallo zusammen,

ich versuche bisher vergeblich eine Variabel die ich im Python-Skript definiert habe im HTML-Code des Template anzeigen zu lassen.

Code: Alles auswählen

anzahl = 10

template = """
{% macro html(this, kwargs) %}

<!doctype html>
<html lang="en">
<head>
</head>
<body>

 
<div id='maplegend' class='maplegend' 
    style='position: absolute; z-index:9999; border:2px solid grey; background-color:rgba(255, 255, 255, 0.8);
     border-radius:6px; padding: 10px; font-size:14px; right: 20px; bottom: 20px;'>
     
<div class='legend-title'>Patientenanzahl</div>
<div class='legend-scale'>
  <ul class='legend-labels'>         
    <li><span style='background:red;opacity:0.9;'></span>[b]Anzahl: {{ anzahl }} [/b]</li>
  </ul>
</div>
</div>
 
</body>
</html>
Das Skript lässt sich ohne Fehlermeldung ausführen, aber die Variabel "Anzahl" wird nicht gezeigt. Hatte auch schon versucht eine Funktion zu erstellen und diese aufzurufen und mir dann den Rückgabewert anzeigen zu lassen, dass hat leider auch nicht funktioniert.

Weiß da jemand vielleicht was ich falsch machen?
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@chilltok: Das lässt sich nicht ohne Fehlermeldung ausführen, denn das ist kein vollständiges Python-Programm. Selbst wenn man die fehlenden schliessenden Anführungszeichen ergänzt, macht das da natürlich nichts ausser zwei Variablen zu definieren.

Wobei das auf Modulebene keine Variablen sein sollten, sondern Konstanten. Was die Vorlage wohl ist, aber `anzahl`?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
chilltok
User
Beiträge: 3
Registriert: Freitag 1. Mai 2020, 17:38

Hallo,

der Code ist ein Ausschnitt gewesen dachte das wäre etwas übersichtlicher, hier ist der Rest. Das Skript soll eine Karte darstellen und darauf verschiedene GPS-Marker anzeigen (das klappt auch soweit). In der Legende möchte ich aber die aktuelle Anzahl wiedergeben. Daran scheitert es leider noch.

Code: Alles auswählen

import folium
from branca.element import Template, MacroElement
import json

template = """
{% macro html(this, kwargs) %}

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Draggable - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  
  <script>
  $( function() {
    $( "#maplegend" ).draggable({
                    start: function (event, ui) {
                        $(this).css({
                            right: "auto",
                            top: "auto",
                            bottom: "auto"
                        });
                    }
                });
});

  </script>
</head>
<body>

 
<div id='maplegend' class='maplegend' 
    style='position: absolute; z-index:9999; border:2px solid grey; background-color:rgba(255, 255, 255, 0.8);
     border-radius:6px; padding: 10px; font-size:14px; right: 20px; bottom: 20px;'>
     
<div class='legend-title'>Patientenanzahl</div>
<div class='legend-scale'>
  <ul class='legend-labels'>    
     
    <li><span style='background:red;opacity:0.9;'></span>Anzahl: {{ anzahl }}</li>    
  </ul>
</div>
</div>
 
</body>
</html>

<style type='text/css'>
  .maplegend .legend-title {
    text-align: left;
    margin-bottom: 5px;
    font-weight: bold;
    font-size: 90%;
    }
  .maplegend .legend-scale ul {
    margin: 0;
    margin-bottom: 5px;
    padding: 0;
    float: left;
    list-style: none;
    }
  .maplegend .legend-scale ul li {
    font-size: 80%;
    list-style: none;
    margin-left: 0;
    line-height: 18px;
    margin-bottom: 2px;
    }
  .maplegend ul.legend-labels li span {
    display: block;
    float: left;
    height: 16px;
    width: 30px;
    margin-right: 5px;
    margin-left: 0;
    border: 1px solid #999;
    }
  .maplegend .legend-source {
    font-size: 80%;
    color: #777;
    clear: both;
    }
  .maplegend a {
    color: #777;
    }
</style>
{% endmacro %}"""

  folium.Marker(
        location=[x.LAT, x.LNG],
        popup="-Nr.: "+str(x.NR)+"\n Letzte Aktualisierung: "+x.TIME,
        icon=folium.Icon(color = "black",icon_color=c, icon='user')
    ).add_to(m)
    m.location =[x.LAT, x.LNG]
    

m.get_root().add_child(macro)

m
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@chilltok: Das ist immer noch kein Python das am Compiler vorbei kommt. Und sollte die Einrückung korrigiert werden, sind `macro`, `c`, `m`, und `x` nicht definiert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

Da fehlt immer noch das entscheidende Stück im Code. template wird immer noch nirgends benutzt.
chilltok
User
Beiträge: 3
Registriert: Freitag 1. Mai 2020, 17:38

Hier ist der vollständige Code:

Code: Alles auswählen

anzahl = 10

template = """
{% macro html(this, kwargs) %}

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>jQuery UI Draggable - Default functionality</title>
  <link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">

  <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
  
  <script>
  $( function() {
    $( "#maplegend" ).draggable({
                    start: function (event, ui) {
                        $(this).css({
                            right: "auto",
                            top: "auto",
                            bottom: "auto"
                        });
                    }
                });
});

  </script>
</head>
<body>

 
<div id='maplegend' class='maplegend' 
    style='position: absolute; z-index:9999; border:2px solid grey; background-color:rgba(255, 255, 255, 0.8);
     border-radius:6px; padding: 10px; font-size:14px; right: 20px; bottom: 20px;'>
     
<div class='legend-title'>Points</div>
<div class='legend-scale'>
  <ul class='legend-labels'>    
     
    <li><span style='background:red;opacity:0.9;'></span>Anzahl: {{ anzahl }}</li>   

  </ul>
</div>
</div>
 
</body>
</html>

<style type='text/css'>
  .maplegend .legend-title {
    text-align: left;
    margin-bottom: 5px;
    font-weight: bold;
    font-size: 90%;
    }
  .maplegend .legend-scale ul {
    margin: 0;
    margin-bottom: 5px;
    padding: 0;
    float: left;
    list-style: none;
    }
  .maplegend .legend-scale ul li {
    font-size: 80%;
    list-style: none;
    margin-left: 0;
    line-height: 18px;
    margin-bottom: 2px;
    }
  .maplegend ul.legend-labels li span {
    display: block;
    float: left;
    height: 16px;
    width: 30px;
    margin-right: 5px;
    margin-left: 0;
    border: 1px solid #999;
    }
  .maplegend .legend-source {
    font-size: 80%;
    color: #777;
    clear: both;
    }
  .maplegend a {
    color: #777;
    }
</style>
{% endmacro %}"""


class Point:
    def __init__(self, nr, sk ,time, lat ,lng):         
        self.NR = nr
        self.SK = sk
        self.TIME = time
        self.LAT = lat
        self.LNG =lng


def AddData(y):    
    obj = json.loads(y)

    for x in Data:
        if x.NR == obj['MAC']:        
            break
    else:
        tmp =  obj['LOC'].split(';')
        lat_values = tmp[0]
        lon_values = tmp[1]      
        s = obj['MAC'].replace(':','')        
        Nr = int(str(int(s, 16))[0:4])   
      
       
        Points.append(Point(Nr,obj['SK'],obj['TIME'],lat_values,lon_values))


Points= []

m = folium.Map(
    location=[51.240447, 6.508115],
    zoom_start=19,
    tiles='OpenStreetMap'
)
macro = MacroElement()
macro._template = Template(template)

tiles='OpenStreetMap'

msg = ({"MAC":"A4:CF:12:DF:6A:9B","SK":1,"LOC":"51.240747;6.508115","TIME":"14:20"})
y = json.dumps(msg)
AddData(y)

for x in Data:
    c = "green"    
    if x.SK == 1:
        c = "red";     
    elif x.SK==4:
        c = "blue"
    elif x.SK==0:
        c = "white"
    folium.Marker(
        location=[x.LAT, x.LNG],
        popup="Nr.: "+str(x.NR)+"\n Letzte Aktualisierung: "+x.TIME,
        icon=folium.Icon(color = "black",icon_color=c, icon='user')
    ).add_to(m)
    m.location =[x.LAT, x.LNG]
    

m.get_root().add_child(macro)

m
Auf der Karte wo ich in der Legende die Anzahl gerne anzeigen lassen würde steht dann nur "Anzahl:"
Benutzeravatar
__blackjack__
User
Beiträge: 13099
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@chilltok: Da fehlen jetzt ziemlich sicher Importe und mindestens `Data` ist nicht definiert. Es kann doch nicht so schwer sein Quelltext komplett zu kopieren‽

Die Zuweisung an ein Attribut das nicht zur öffentlichen API des Objekts gehört (`_template`) sieht auch kaputt aus.

Namen sollten keine kryptischen Abkürzungen enthalten und schon gar nicht aus einzelnen Buchstaben bestehen. Wenn man `color` meint, sollte man nicht `c` schreiben. Bei anderen Namen kann man nur raten wie die denn tatsächlich heissen sollten.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Daraus folgt das Funktionen und Methoden alles was sie ausser Konstanten benötigen als Argument(e) übergeben bekommen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Die Attributnamen von `Point` sind also alle falsch, weil das keine Konstanten sind.

Der letzte Ausdruck ``m`` macht so keinen Sinn.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten