[PYTHON] Erstellen Sie eine einfache App, die die Fetch-API für Ajax-Anforderungen in Flask enthält, und erklären Sie sie schnell.

Einführung

・ Für diejenigen, die angefangen haben, Flask und JavaScript zu studieren

Erstellen Sie eine Flask-App, um Bilder von Katzen mit der Fetch-API zu erhalten

Kolben vorbereiten. Wenn Sie sich bei Flask immer noch nicht sicher sind, lesen Sie den folgenden Artikel. [Wahrscheinlich das zweitbeliebteste Webanwendungsframework in Python] Fassen Sie die Grundlagen von Flask auf leicht verständliche Weise zusammen

Die Konfiguration ist wie folgt.

app.py
templates
└─hello.html

app.py


from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def hello_world():
    return render_template('hello.html')

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

hello.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>hello</title>
    <h1>hello</h1>
</head>
<body>
    
</body>
</html>

Wenn Sie Flask oben starten, wird der folgende Bildschirm im Browser angezeigt. image.png

Die Version, die die API in JavaScript trifft

Lassen Sie uns nun das Bild der Katze mit der Fetch-API anzeigen. Klicken Sie auf die Schaltfläche, um das Bild der Katze anzuzeigen.

Der gesamte HTML-Code ist unten

.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>hello</title>
    <style>
        .w300 {
            width: 300px;
        }
    </style>
</head>
<body>
    <form id="form">
        <div id="image"></div>
        <button id="lookCatButton" type="button">Sehen Sie die Katze</button>
    </form>
    <script>
        const url = 'https://api.thecatapi.com/v1/images/search?size=full';
        const options = {
            method: 'GET'
        }

        function getCatImage(url, options){
            return fetch(url, options)
            .then( response => response.json() );
        }
        async function getImage(url, options){
            const response = await getCatImage(url, options);
            const imageDiv = document.getElementById("image");
            const imageElement = document.createElement("img");
            imageElement.src = response[0].url;
            imageElement.className = "w300";
            imageDiv.appendChild(imageElement);
        }
        document.getElementById("lookCatButton")
        .addEventListener("click", () =>{
            getImage(url, options)
        })
    </script>
</body>
</html>

Erläuterung

Mit der Abruf-API können Sie das Anforderungsziel ** URL ** und die zweiten ** Optionen ** als erstes Argument festlegen. Definieren Sie diesmal die URL und die Optionen wie folgt.

.js


const url = 'https://api.thecatapi.com/v1/images/search?size=full';
const options = {method: 'GET'};

Geben Sie in den Optionen GET als Anforderungsmethode an. Wenn Sie mehr über Optionen erfahren möchten, lesen Sie bitte die folgenden Informationen. https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch https://developer.mozilla.org/ja/docs/Web/API/WindowOrWorkerGlobalScope/fetch

Da der Rückgabewert von fetch von [Versprechen] zurückgegeben wird (https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise), können Sie die Methode **. Then () ** verwenden. Ich werde. Und da die Rückruffunktion in ** verwendet werden kann. Dann () **, weglassen (), weil es ein ** Argument in der ** Pfeilfunktion ** gibt, und weglassen {}, weil es die einzige Anweisung ist, die zurückgibt. **.

.js


fetch(url, options)
.then( response => response.json() );

Wenn Sie es mit der Pfeilfunktion schreiben, die nicht ausgelassen wird, sieht es wie folgt aus.

.js


fetch(url, options)
.then( (response) => {
    return response.json()
});

Bei Verwendung von fetch kann der danach geschriebene Code ausgeführt werden, bevor die Anforderung gesendet und die Antwort zurückgegeben wird. Daher verwende ich ** asyn / await **, um den Abruf auszuführen und den nachfolgenden Code auszuführen, nachdem die Antwort zurückgegeben wurde.

Definieren Sie eine ** asynchrone Funktion ** und fügen Sie ** wait ** zu der Funktion hinzu, die fetch verwendet, und fügen Sie sie in eine Variable ein. Es ist der folgende Teil

.js


async function getImage(url, options){
    const response = await getCatImage(url, options);

Danach wird die Bild-URL der Katze als appendChild angezeigt.

Da die Reihe von Prozessen nach dem Klicken auf die Schaltfläche ausgeführt wird, wird sie ausgeführt, wenn mit ** addEventListener ** ** geklickt ** wird.

.js


document.getElementById("lookCatButton")
.addEventListener("click", () =>{
    getImage(url, options)
})

Jedes Mal, wenn Sie die Taste drücken, wird das Bild der Katze angezeigt. image.png

Wagen Sie es, die API auf der Python-Seite zu treffen

Wie oben erwähnt, erfordert Fetch, dass die URL die Anforderung an das erste Argument sendet. Erstellen Sie daher ** die Anforderungsziel-URL mit Flask-Routing **. Daher muss der Code zum Abrufen der Daten der Neko-chan-API und ** return ** mit jsonify bei der Rückgabe als Antwort mit json ausgegeben werden.

Ich habe den folgenden Code gemacht. ** / get_data ** wird hinzugefügt.

from flask import Flask, render_template, jsonify
import requests
app = Flask(__name__)


@app.route('/get_data')
def get_data():
    url = 'https://api.thecatapi.com/v1/images/search?size=full' #Neko-Chan API
    response = requests.get(url)
    cat_img_url = eval(response.text)[0]['url'] #Hier können Sie die Bild-URL abrufen
    response_data = {
        'cat_img_url' : cat_img_url
    }
    return jsonify(response_data) #Kehren Sie mit jsonify zu js Seite zurück


@app.route('/')
def hello_world():
    return render_template('hello.html')

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

Ändern Sie auf der JavaScript-Seite die URL des Anforderungsziels in **. / Get_data ** des zuvor festgelegten Routing-Ziels.

.js


const url = './get_data';

Da der in json ausgegebene Wert von Python eingegeben wird, erhalten Sie den auf der Python-Seite festgelegten "cat_img_url".

.js


imageElement.src = response.cat_img_url;

Alles andere ist das gleiche und der Gesamtcode lautet wie folgt.

.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .w300 {
            width: 300px;
        }
    </style>
</head>
<body>
    <form id="form">
        <div id="image"></div>
        <button id="lookCat" type="button">Sehen Sie die Katze</button>
    </form>
    <script>
        const url = './get_data';
        const options = {
            method: 'GET'
        }

        function getCatImage(url, options){
            return fetch(url, options)
            .then( response => response.json() );
        }
        async function getImage(url, options){
            const response = await getCatImage(url, options);
            const imageDiv = document.getElementById("image");
            const imageElement = document.createElement("img");
            imageElement.src = response.cat_img_url;
            imageElement.className = "w300";
            imageDiv.appendChild(imageElement);
        }
        document.getElementById("lookCat")
        .addEventListener("click", () =>{
            getImage(url, options)
        })
    </script>
</body>
</html>

Wenn Sie jetzt auf die Schaltfläche klicken, können Sie das Bild abrufen und auf der Python-Seite anzeigen.

image.png

Übrigens, wenn Sie dieses Mal direkt auf das hinzugefügte Routing-Ziel zugreifen, werden die folgenden Inhalte angezeigt. image.png

abschließend

Dieses Mal habe ich versucht, eine Anfrage und eine Antwort mit zwei Mustern abzurufen, von denen eines auf der Python-Seite und das andere auf der JavaScript-Seite angefordert wurde, was sehr gut für die Organisation meiner Gedanken war.

Verweise

Hinweise zur neuesten Ajax-Anforderungskommunikation und Fetch-API [Wahrscheinlich das zweitbeliebteste Webanwendungsframework in Python] Fassen Sie die Grundlagen von Flask auf leicht verständliche Weise zusammen MDN web docs - Fetch API MDN-Webdokumente - Verwenden von Fetch MDN-Webdokumente - Rückruffunktion MDN-Webdokumente - Pfeilfunktionen MDN web docs - async function

Recommended Posts

Erstellen Sie eine einfache App, die die Fetch-API für Ajax-Anforderungen in Flask enthält, und erklären Sie sie schnell.
Ein einfacher Mock-Server, der den HTTP-Anforderungsheader einfach in den Hauptteil der Antwort einbettet und zurückgibt.
Erstellen Sie eine einfache GUI-App in Python
Erstellen Sie eine einfache Web-App mit Flasche
Erstellen Sie eine REST-API mit dem in Lobe und TensorFlow Serving erlernten Modell.
Erstellen Sie eine Web-App, die PDF mit Flask und PyPDF2 in Text konvertiert
Erstellen Sie einen Filter, um ein Zugriffstoken mit der Graph-API (Flask) zu erhalten.
Wenn Sie eine Methode in einer Ruby-Klasse definieren und dann eine Methode darin definieren, wird sie zu einer Methode der ursprünglichen Klasse.
Das Ergebnis der Erstellung eines Kartenalbums italienischer Jungvermählten in Python und dessen Weitergabe
Erstellen Sie eine einfache API, um JSON-Dateien einzugeben und auszugeben ~ Python / Flask Edition ~
Eine einfache Möglichkeit, den Wert im Eigenschaftsdekorator zwischenzuspeichern. Schreibgeschützt. Beachten Sie, dass er so lange zwischengespeichert wird, bis das Objekt gelöscht wird.
Ein Server, der mit Flasche.py und OpenCV die Anzahl der Personen vor der Kamera zurückgibt
Analysieren Sie die Researchmap-API mit Python und erstellen Sie automatisch eine Word-Datei für die Leistungsliste
Schritte zum Einrichten von Pipenv, Erstellen einer CRUD-App mit Flask und Containerisieren mit Docker
Holen Sie sich den Kauf- und Verkaufspreis der virtuellen Währung mit der API von Zaif Exchange und erstellen Sie ein Diagramm
Ein Programm, das den Servobefehl der Funksteuerung empfängt, den Raspetorte unterbricht und protokolliert.
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Ein einfacher Grund, warum der Rückgabewert von round (2.675,2) in Python 2,67 beträgt (in Wirklichkeit sollte er 2,68 betragen ...)
Ich habe mit Heroku + Flask + PostgreSQL (Heroku Postgres) einen LINE-Bot erstellt, der mir den Typ und die Stärke von Pokemon in der Garal-Region angibt.
pandas Ruft den Namen einer Spalte ab, die ein bestimmtes Zeichen enthält
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
Durchsuchen Sie das Verzeichnis und erstellen Sie eine Liste mit Verzeichnispfaden und Dateinamen
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
[Rails 6] Betten Sie Google Map in die App ein und fügen Sie der eingegebenen Adresse einen Marker hinzu. [Bestätigung der Details]
[Python / Jupyter] Übersetzen Sie den Kommentar des in die Zwischenablage kopierten Programms und fügen Sie ihn in eine neue Zelle ein.
Ich habe ein POST-Skript erstellt, um ein Problem in Github zu erstellen und es im Projekt zu registrieren
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
[CleanArchitecture mit Python] Wenden Sie CleanArchitecture Schritt für Schritt auf eine einfache API an und versuchen Sie zu verstehen, welche Art von Änderung in der Codebasis stark ist.