Flask: Variable an render_template um url_for(..) image zu laden

Django, Flask, Bottle, WSGI, CGI…
Antworten
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hallo,

ich möchte einen Bildnamen an mein html übergeben, sodass dieses nach dem Namen des Bildes mit url_for(..) suchen kann. Aber er findet das Bild nicht...

views:

Code: Alles auswählen

@app.route ("/home")
def home():
    image_list = os.listdir(path)
    return render_template('home.html', image_list=image_list)
html:

Code: Alles auswählen

<img src="{{ url_for('static', filename='images/image_list[0]')}}"/>
Error: Not Found.

Was mache ich falsch?

LG und schöne Weihnachten
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
sparrow
User
Beiträge: 4548
Registriert: Freitag 17. April 2009, 10:28

Warum willst du dem Template so viel Intelligenz aufbürden?
Ich mache nichts mit Flask, aber ich sehe nicht, wie irgend eine Template-Engine da wissen soll, wo Pfad und wo Variable sich trennen.

Statt eine Liste zu übergeben und da das erste Element in Telplate heraus zu prokeln, würde ich den Pfad im View verfollständigen und den dann übergeben.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Würde halt gerne Bilder bei jeden Aufruf zufällig angeordnet anzeigen lassen und ich würde die übergebene Liste vor jedem Aufruf einmal

Code: Alles auswählen

random.shuffle(image_list)
, sodass sich die Bilder dann automatisch anders anordnen, weil der Pfad ein anderer ist. Würde ich für jedes Bild den kompletten Link übergeben, dann müsste ich ja 20 Argumente im view übergeben
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
sparrow
User
Beiträge: 4548
Registriert: Freitag 17. April 2009, 10:28

Dann pack die 20 Pfade - oder entsprechende Objekte - in eine Liste, shuffle die und iterier im Template über die Elemente, statt Index-Zugriffe zu verwenden. Oder wolltest du 20 mal die selbe Zeile ins Template schreiben?
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Bevor ich etwas Dummes antworte muss ich darüber nachdenken. Danke für den Hinweis.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Habe es glaube ich genau so gemacht wie du meintest:

Code: Alles auswählen

     
        {% for image in image_list %}
          <div class="row">
            <a href="{{ url_for('static', filename=image) }}" >
              <img src="{{ url_for('static', filename=image)}}" class="img-responsive"/>
            </a>
          </div>
        {% endfor %}
 
Danke. War ein richtiges Aha-Erlebnis.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Habe noch eine andere Frage:

Versuche mit Flask ein background-image zu einem div zu setzen und habe es jetzt so gemacht:

Code: Alles auswählen

<div class="col" style=" background-image:url(' {{ url_for('static', filename=variabler_pfad)}} ')">
</div>
Aber VSC meckert herum bei 'static':
Sets the background image(s) of an element.

Syntax: <bg-image>#

MDN Reference

) expectedcss(css-rparentexpected)
und bei der letzten Klammer:
semi-colon
expectedcss(css-semicolonexpected)

Aber das div mit den Hintergrundbild wird ordnungsgemäß gerendert.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
__blackjack__
User
Beiträge: 14136
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naheliegend: VSC sieht das halt als CSS und weiss nicht das da Teile *später* mal durch gültiges CSS ersetzt werden. So wie es da steht ist es als CSS fehlerhaft.

Und am Ende fehlt ein Semikolon.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Wenn ich ein Semikolon schreibe, verschwindet der Fehler nicht.

Kann man nicht Pythonvariablen bis ins stylesheet.css tragen? Oder gibt es eine schönere Variante?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 4209
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Kann man nicht Pythonvariablen bis ins stylesheet.css tragen? Oder gibt es eine schönere Variante?
Nee, ist ja eine eigene (statische) Datei. Du kannst aber eine <style>...</style> Sektion in deine HTML-Datei einbauen, die kannst du auch mit Variablen für Jinja befüllen.

Gruß, noisefloor
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Okey, danke für die Antworten
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Antworten