[Flask] Content aus Datei ausgeben

Django, Flask, Bottle, WSGI, CGI…
Antworten
overflow
User
Beiträge: 11
Registriert: Sonntag 30. Dezember 2012, 00:18

Hallo zusammen,

nach langem Recherchieren bin ich leider nicht ganz fündig geworden und frage daher mal hier.

Ich möchte Code und Content in meinem Python Flask Projekt trennen, daher habe ich den Content ausgelagert in einer eigene Datei. (content.json)

Code: Alles auswählen

{
    "book":[
       {
          "id":"444",
          "language":"C",
          "edition":"First",
          "author":"Dennis Ritchie "
       },
       {
          "id":"555",
          "language":"C++",
          "edition":"second",
          "author":" Bjarne Stroustrup "
       }
    ]
 }  

Damit ich den Content ansprechen kann, habe ich die Daten auch über die views.py geladen:

Code: Alles auswählen

@views.route('/')
def index():
    with open('website/content.json', 'r') as f:
        data = json.load(f)
        return render_template('index.html', content=data)
Aber bei der Ausgabe tue ich mir schwer... Wie kann ich nur "book" oder die erste "id" oder "Dennis Ritchie" ausgeben?
Meine index.html sieht wie folgt aus:

Code: Alles auswählen

{% extends 'base.html' %}
{% block content %}
<p>{{ content }}</p>
{% endblock %}
Vielen Dank für die Hilfe
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@overflow,

das

Code: Alles auswählen

{% extends 'base.html' %}
{% block content %}
<p>{{ content }}</p>
{% endblock %}
is Jinja2 Syntax. Damit kann Flask die daten in die HTML Seite "einarbeiten".
Dazu kann man innerhalb der {%%} - Blöcke Python Code verwenden:
https://jinja.palletsprojects.com/en/3. ... on-methods
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@overflow: Was meinst Du mit "book" ausgeben? Um nur die Zeichenkette auszugeben brauchst die JSON-Datei nicht. Ansonsten kann man in einer Jinja2-Vorlage genau so direkt auf Schlüssel und Indexwerte in einer Python-Datenstruktur zugreifen wie in Python auch. Also

Code: Alles auswählen

{% extends "base.html" %}
{% block content %}
<p>{{ content["books"][0]["author"] }}</p> {# -> Dennis Ritchy #}
{% endblock %}
Ansonsten kennt Jinja2 auch Kontrollstrukturen um beispielsweise alle Bücher in der Seite als Liste zu setzen:

Code: Alles auswählen

{% extends "base.html" %}
{% block content %}
<p>
  <ul>
    {% for book in content["books"] %}
      <li>{{ book["id"] }} — {{ book["author"] }}</li>
    {% endfor %}
  </ul>
</p>
{% endblock %}
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
overflow
User
Beiträge: 11
Registriert: Sonntag 30. Dezember 2012, 00:18

Danke an euch beiden, damit ist mir geholfen.

Ziel ist es den gesamten Content für alle Seiten ausgelagert in einer Datei zu verwalten. Muss nicht zwingend im json Format sein.
Antworten