Więc majstruję przy star wars swapi API i renderuję moje wyszukiwanie API do pliku html jako ciąg znaków, jednak nie mogę oddzielić tytułów w ciągu po linii:

from flask import Flask, render_template, request, redirect
import requests
import json
import swapi

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def index():
    url = "https://swapi.co/api/"
    star_wars_api = requests.get(url)

    result = ''
    if request.method == 'POST':
        films = requests.get(star_wars_api.json()['films'])
        if films.status_code == 200:
            if request.form['search'] == "films":
                film_json = films.json()

                for film in film_json['results']:
                    result += str(film['title'])

                return render_template('index.html', results=result)
    else:
        return render_template('index.html')


if __name__ == "__main__":
    app.run(debug=True)

Oto plik HTML:

{% extends 'base.html'%}

{% block head %} {% endblock %}

{% block body %}

<form action="/" method="POST">
    <label for="search">Search:</label>
    <input class="form-control" type="text" name="search" id="search" placeholder="Search" aria-label="Search">
    <br>
    <input type="submit" value="Post">
</form>

<p> {{ results }}</p>

{% endblock %}

Oto wynik: (na stronie index.html)

„Nowa nadzieja Atak klonów Mroczne widmo Zemsta Sithów Powrót Jedi Imperium kontratakuje Przebudzenie mocy” (bez cytatów)

2
Nemo726 16 grudzień 2019, 06:47
Usunę zbędne cytaty, aby złagodzić zamieszanie, jednak usunięcie nie zmienia w żaden sposób danych wyjściowych.
 – 
Nemo726
16 grudzień 2019, 07:11
Co masz w results? Jeśli pojedyncza linia, to nie możesz jej podzielić. Jeśli masz wiele linii, zamień '\n na <br> lub użyj <pre></pre> zamiast <p></p>
 – 
furas
16 grudzień 2019, 07:47
Szczerze mówiąc, powinieneś wysyłać tytuły jako listę, a nie ciągi i użyć {% for %} w szablonie, aby wyświetlić każdy tytuł w oddzielnym <p> lub dodać <br> do każdego tytułu.
 – 
furas
16 grudzień 2019, 07:49

1 odpowiedź

W HTML musisz użyć <br> zamiast \n, aby umieścić tekst w nowej linii.

Powinieneś otrzymać tytuły jako listę, a następnie użyć "<br>".join(titles)

titles = []

for film in film_json['results']:
    titles.append( film['title'] )

result = "<br>".join(titles)

return render_template('index.html', results=result)

Lub prześlij listę z tytułami do szablonu

result = []

for film in film_json['results']:
    result.append( film['title'] )

return render_template('index.html', results=result)

I użyj pętli {% for %} w szablonie

<p>
{% for title in results %} 
{{ title }}<br>
{% endfor %}
</p>

Ostatecznie powinieneś dodać '\n' do każdego tytułu

for film in film_json['results']:
    result += film['title'] + "\n"

return render_template('index.html', results=result)

I użyj zamiast tego <pre> <p> i będzie przestrzegać "\n" (ale użyje czcionki o stałej szerokości, ponieważ została utworzona do wyświetlania kodu - jak ten kod w odpowiedzi)

<pre>{{ result }}</pre>
2
furas 16 grudzień 2019, 09:01
To było to! Próbowałem wymyślić, jak wysłać każdy tytuł do listy, ale jestem w tym nowy i całkowicie zapomniałem, że mogę dołączyć każdy z nich, także pętlę jinja for.
 – 
Nemo726
16 grudzień 2019, 08:31