Flask ist ein leichtes Webanwendungsframework für Python.
Was ist ein Framework? Es fasst die Funktionen zusammen, die für die Entwicklung von Anwendungssoftware erforderlich sind. Ein Paket, mit dem Sie einfach ein Framework / eine Vorlage erstellen können.
Schienen für die Sprache Ruby Für Python sind Django und Flask der Mainstream.
Sie können Webanwendungen einfach und leicht entwickeln, indem Sie sie in eine Vorlage namens Flask einfügen.
Wir werden mit MNIST eine handschriftliche Zeichenidentifizierungsanwendung erstellen. Verarbeiten Sie mit dem Server mithilfe von Flask und erstellen Sie das Erscheinungsbild der Anwendung mit HTML und CSS.
Um zu erfahren, was Flask kann, führen wir zunächst die kleinste Flask-Webanwendung aus.
hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "Hello World!"
if __name__ == "__main__":
app.run()
Da es auf Fastpyter nicht ausgeführt werden kann, ist das Folgende die Arbeit in der lokalen Umgebung.
Erstellen Sie hello.py in Ihrem Editor und kopieren Sie den obigen Code und fügen Sie ihn ein
Geben Sie python hello.py in das Terminal ein und führen Sie es aus
Greifen Sie auf http://127.0.0.1:5000/ zu.
Drücken Sie nach der Bestätigung Strg + C, um den Vorgang zu beenden.
Schauen wir uns diesen Code genauer an.
Erklären Sie zunächst, dass Sie die Flask-Klasse des Flask-Pakets verwenden möchten.
from flask import Flask
Erstellen Sie als Nächstes eine Instanz der Flask-Klasse mit dem Namen app.
app.<Name der Flask-Klassenmethode>
Ermöglicht die Verwendung der Methoden der Flask-Klasse
app = Flask(__name__)
Ich bekomme hier ein unbekanntes @ Zeilen, die mit @ beginnen, werden als Dekoratoren bezeichnet Machen Sie etwas mit der in der nächsten Zeile definierten Funktion oder Klasse.
app.route () hat die in der nächsten Zeile definierte Funktion angegeben Wir verarbeiten, um mit URL zu verknüpfen. Im Argument von app.route () Geben Sie die URL nach [http://127.0.0.1:5000/] an.
Das heißt, im folgenden Code beim Zugriff auf http://127.0.0.1:5000/ Dies bedeutet, dass die Funktion hello_world () aufgerufen wird und Hello World!
@app.route('/')#http://127.0.0.1:5000/Geben Sie den nachfolgenden Pfad an
def hello_world():
return "Hello World!"
name == '__ main__' ist True Das heißt, nur wenn dieser Code direkt ausgeführt wird app.run () wird ausgeführt und die Flask-App gestartet.
if __name__ == "__main__":
app.run()
Durch die Beschreibung von if name == '__ main__': früher Wenn Sie das Python-Skript direkt ausführen Nur (wie beim Ausführen von python filename.py in der Befehlszeile)
if name == '__ main__': Sie können die folgende Verarbeitung ausführen. Und wenn es aus einer anderen Datei importiert wird, wird es nicht verarbeitet. Diese Beschreibung wird beispielsweise verwendet, wenn Sie ein eigenes Modul erstellen und testen Es wird verwendet, wenn Sie unnötige Verarbeitung verhindern möchten.
Schauen wir uns diesen Mechanismus hier genauer an. Übrigens ist name eine Variable, die automatisch für jede Skriptdatei definiert wird. Der Dateiname (Modulname) wird automatisch gespeichert.
Wenn Sie die Datei jedoch direkt ausführen, wird main automatisch in name gespeichert. Schauen wir uns das folgende Beispiel an.
Beispiel) Was wird ausgegeben, wenn der folgende test1.py ausgeführt wird?
test1.py
#Funktionsshow()Ist definiert
def show():
return __name__
print(__name__)
#Ausgabeergebnis
__main__
Weil test1.py direkt ausgeführt wird main wird automatisch in name gespeichert, sodass main ausgegeben wird.
Wenn das Python-Skript direkt so ausgeführt wird Weil main in einer Variablen namens name gespeichert ist
name == '__ main__ wird True if name == '__ main__': Die folgende Verarbeitung wird ausgeführt.
Übrigens habe ich eine sehr einfache App erstellt, die nur Hello World! Dieses Mal werden wir HTML und CSS reflektieren, um es mehr wie eine Webanwendung zu machen.
Der Inhalt wird in Einführung in HTML & CSS erläutert.
mnist.py
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
return render_template('index.html')
if __name__ == "__main__":
app.run()
Sie arbeiten in einer lokalen Umgebung.
1, Erstellen Sie einen Ordner mit einem geeigneten Namen (z. B. mnist_app) auf dem Desktop usw.
2, Erstellen Sie mnist.py im Ordner mnist_app und kopieren Sie den obigen Code und fügen Sie ihn ein
3, Erstellen Sie einen Vorlagenordner im Ordner mnist_app und erstellen Sie darin die Datei index.html Kopieren Sie den Code von HTML-Vorlagenerklärung 1/5 und fügen Sie ihn in index.html ein
4, Erstellen Sie einen statischen Ordner im Ordner mnist_app Erstellen Sie darin die Datei stylesheet.css (Flask soll im Vorlagenordner nach der HTML-Datei und im statischen Ordner nach der CSS-Datei suchen.) Kopieren Sie den Code von CSS-Vorlagenerklärung 1/5 und fügen Sie ihn in stylesheet.css ein
5, cd mnist_app /, um in den Ordner mnist_app zu wechseln
6, Geben Sie python mnist.py in das Terminal ein und führen Sie es aus
7, Zugriff http://127.0.0.1:5000/
Drücken Sie nach der Bestätigung Strg + C, um den Vorgang zu beenden.
Schauen wir uns den Code genauer an. Was unterscheidet sich von dem Code, mit dem Sie die kleinste Flask-App ausführen können?
return render_template('index.html')nur.
@app.route('/')
def hello_world():
return render_template('index.html')
Bisher haben wir die Webseiten-Seite entworfen und einen Datei-Uploader erstellt. Sie können die Datei jedoch nicht hochladen, ohne den Code auf der Flask-Seite hinzuzufügen.
Hier erhalten wir das von der Webseite hochgeladene Bild und identifizieren es mit dem trainierten Modell. Schauen wir uns den Code an, der das Ergebnis anzeigt.
Bevor Sie den Code mit dieser ipynb-Datei ausführen Bitte bereiten Sie das trainierte Modell model.h5 im selben Verzeichnis vor.
mnist.py
import os
from flask import Flask, request, redirect, url_for, render_template, flash
from werkzeug.utils import secure_filename
from keras.models import Sequential, load_model
from keras.preprocessing import image
import tensorflow as tf
import numpy as np
classes = ["0","1","2","3","4","5","6","7","8","9"]
num_classes = len(classes)
image_size = 28
UPLOAD_FOLDER = "uploads"
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
app = Flask(__name__)
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
model = load_model('./model.h5')#Laden Sie das trainierte Modell
graph = tf.get_default_graph()
@app.route('/', methods=['GET', 'POST'])
def upload_file():
global graph
with graph.as_default():
if request.method == 'POST':
if 'file' not in request.files:
flash('Keine Datei')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('Keine Datei')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(UPLOAD_FOLDER, filename))
filepath = os.path.join(UPLOAD_FOLDER, filename)
#Lesen Sie das empfangene Bild und konvertieren Sie es in das np-Format
img = image.load_img(filepath, grayscale=True, target_size=(image_size,image_size))
img = image.img_to_array(img)
data = np.array([img])
#Übergeben Sie die transformierten Daten zur Vorhersage an das Modell
result = model.predict(data)[0]
predicted = result.argmax()
pred_answer = "das ist" + classes[predicted] + "ist"
return render_template("index.html",answer=pred_answer)
return render_template("index.html",answer="")
if __name__ == "__main__":
app.run()
Da es auf Fastpyter nicht ausgeführt werden kann, ist das Folgende die Arbeit in der lokalen Umgebung.
Ersetzen Sie mnist.py durch den obigen Code
Erstellen Sie einen Upload-Ordner in derselben Hierarchie wie mnist.py
Fügen Sie model.h5, das das zuvor trainierte Modell gespeichert hat, in dieselbe Hierarchie wie mnist.py ein
Behalten Sie die Dateiposition bei, geben Sie python mnist.py in das Terminal ein und führen Sie es aus
Gehen Sie zu http://127.0.0.1:5000/
Laden wir nun ein numerisches Bild hoch.
Drücken Sie nach der Bestätigung Strg + C, um den Vorgang zu beenden.
Schauen wir uns diesen Code genauer an.
Importieren Sie zunächst die erforderlichen Bibliotheken und Module.
import os
from flask import Flask, request, redirect, url_for, render_template, flash
from werkzeug.utils import secure_filename
from keras.models import Sequential, load_model
from keras.preprocessing import image
import tensorflow as tf
import numpy as np
Speichern Sie als Nächstes die Klassennamen, die Sie klassifizieren möchten, in der Klassenliste. Dieses Mal werden wir die Zahlen klassifizieren, also setzen Sie sie auf 0-9. Übergeben Sie die Größe des für das Training verwendeten Bildes an imaze_size. Dieses Mal habe ich den MNIST-Datensatz verwendet und ihn auf 28 gesetzt.
classes = ["0","1","2","3","4","5","6","7","8","9","10"]
num_classes = len(classes)
image_size = 28
Übergeben Sie den Namen des Ordners, um das hochgeladene Bild in UPLOAD_FOLDER zu speichern. Geben Sie für ALLOWED_EXTENSIONS die Erweiterungen an, die das Hochladen ermöglichen.
UPLOAD_FOLDER = "uploads"
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg'])
Erstellen Sie eine Instanz der Flask-Klasse.
app = Flask(__name__)
Definiert eine Funktion, die die Erweiterung hochgeladener Dateien überprüft. Gibt True zurück, wenn die beiden Bedingungen vor und nach und erfüllt sind.
Die erste Bedingung '.' Im Dateinamen ist Gibt an, ob das Zeichen in der Variablen Dateiname vorhanden ist.
Die zweite Bedingung Dateiname.rsplit ('.', 1) [1] .lower () in ALLOWED_EXTENSIONS Gibt an, ob die Zeichenfolge nach. In der Variablen Dateiname einer von ALLOWED_EXTENSIONS entspricht.
rsplit () ist im Grunde dasselbe wie split (). Split () wurde jedoch vom Anfang der Zeichenfolge getrennt Die Reihenfolge des Trennzeichens für rsplit beginnt am Ende der Zeichenfolge.
lower () konvertiert die Zeichenfolge in lower.
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
Laden Sie das trainierte Modell. graph = tf.get_default_graph () ist der Code, der für den Keras-Fehler benötigt wird. Machen Sie sich also keine Sorgen.
model = load_model('./model.h5')#Laden Sie das trainierte Modell
graph = tf.get_default_graph()
Als nächstes definieren wir die Funktion, die ausgeführt werden soll, wenn auf die oberste Seite zugegriffen wird.
GET und POST sind eine Art HTTP-Methode.
Ich werde die ausführliche Erklärung weglassen GET ruft Ressourcen ab (beim Zugriff auf die Seite wird eine HTML-Datei abgerufen) POST bedeutet das Senden von Daten an den Server.
global graph、with graph.as_default():Ebenfalls
Keine Sorge, es wird wegen eines Keras-Fehlers benötigt.
request ist eine Funktion zum Verarbeiten von Daten, die von einem Formular im Web gesendet werden request.method enthält die Anforderungsmethode Dies wird auch in Einführung in HTML und CSS erläutert. Und wenn request.method == 'POST', wird der folgende Code ausgeführt.
@app.route('/', methods=['GET', 'POST'])
def upload_file():
global graph
with graph.as_default():
if request.method == 'POST':
Enthält die POST-Anforderung hier Dateidaten? Es wird auch geprüft, ob die Datei einen Dateinamen hat.
redirect () ist eine Funktion, die zu der im Argument angegebenen URL umleitet request.url enthält die URL der Seite, auf der die Anfrage gestellt wurde.
Das heißt, wenn keine hochgeladene Datei oder kein Dateiname vorhanden ist, wird zur ursprünglichen Seite zurückgekehrt.
if 'file' not in request.files:
flash('Keine Datei')
return redirect(request.url)
file = request.files['file']
if file.filename == '':
flash('Keine Datei')
return redirect(request.url)
Überprüfen Sie dann die Erweiterung der hochgeladenen Datei.
Danach macht Secure_Dateiname () alle gefährlichen Zeichenfolgen im Dateinamen ungültig (bereinigt).
Verbinden Sie als Nächstes die als Argumente angegebenen Pfade mit os.path.join () gemäß os. (Kombiniert mit \ unter Windows, kombiniert mit / unter Mac und Linax) Speichern Sie das hochgeladene Bild in diesem Pfad. Außerdem wird das Speicherziel im Dateipfad gespeichert.
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(UPLOAD_FOLDER, filename))
filepath = os.path.join(UPLOAD_FOLDER, filename)
Schließlich bestimmen wir die Nummer des hochgeladenen Bildes. Hier verwenden wir eine Funktion namens image.load_img von Keras, mit der Bilder gleichzeitig geladen und in der Größe geändert werden können.
Geben Sie im Argument die URL des Bildes an, das Sie laden möchten, und die Größe, deren Größe Sie ändern möchten.
Weitere Graustufen=Indem Sie True übergeben
Es kann in Schwarzweiß gelesen werden. image.img_to_array konvertiert das im Argument angegebene Bild in ein Numpy-Array.
Sie müssen auch eine Liste von Numpy-Arrays an model.predict () übergeben. Daher wird img als Liste an np.array () übergeben. Das Vorhersageergebnis wird in pred_answer gespeichert.
#Lesen Sie das empfangene Bild und konvertieren Sie es in das np-Format
img = image.load_img(filepath, grayscale=True, target_size=(image_size,image_size))
img = image.img_to_array(img)
data = np.array([img])
#Übergeben Sie die transformierten Daten zur Vorhersage an das Modell
result = model.predict(data)[0]
predicted = result.argmax()
pred_answer = "das ist" + classes[predicted] + "ist"
Durch Übergabe von answer = pred_answer an das Argument von ender_template Sie können der in index.html geschriebenen Antwort pred_answer zuweisen.
return render_template("index.html",answer=pred_answer)
Wenn keine POST-Anfrage gestellt wird (einfach auf die URL zugreifen) In der Antwort von index.html wird nichts angezeigt.
return render_template("index.html",answer="")
Schließlich wird app.run () ausgeführt und der Server gestartet.
if __name__ == "__main__":
app.run()
Bis vor kurzem habe ich die Web-App nur auf meinem eigenen Computer ausgeführt. Hier erfahren Sie, wie Sie eine Web-App für Heroku bereitstellen und weltweit veröffentlichen.
So stellen Sie den Server bei der Bereitstellung von Webanwendungen extern zur Verfügung
host='0.0.0.0'Angeben.
port = int(os.environ.get('PORT', 8080))Dann
Die Portnummer, die in Heroku verwendet werden kann, wird erfasst und per Post gespeichert.
Wenn nicht eingestellt, wird 8080 gespeichert.
Am Ende von mnist.py
if __name__ == "__main__":
app.run()
Teil von
if __name__ == "__main__":
port = int(os.environ.get('PORT', 8080))
app.run(host ='0.0.0.0',port = port)
Bitte schreiben Sie den obigen Code neu.
Richten Sie Heroku ein.
Vor dem Ausführen des Codes Befindet sich im Verzeichnis mnist_app, das sich im selben Verzeichnis wie diese ipynb-Datei befindet Bitte bereiten Sie Procfile, require.txt, runtime.txt vor
Registrieren Sie sich zunächst als Mitglied von Heroku und melden Sie sich an. Als nächstes installieren Sie Heroku.
Bitte installieren Sie von der [Heroku CLI] -Seite (https://devcenter.heroku.com/articles/heroku-cli). Git wird zur gleichen Zeit installiert, zu der Sie Heroku CLI installieren.
Hier erfahren Sie, wie Sie Heroku bereitstellen.
1, wechseln Sie in das Verzeichnis mit den App-Dateien (cd __)
3, gehe nach Heroku, Geben Sie Create New App-> App name ein Wechseln Sie zu der Seite der App, auf der das Land in den USA registriert ist, und wechseln Sie zu Setteings Klicken Sie auf Build Pack hinzufügen, um Python hinzuzufügen
Verschieben Sie die drei folgenden Dateien in das Verzeichnis, in dem sich die App befindet (Es befindet sich im Verzeichnis mnist_app, das sich im selben Verzeichnis wie diese ipynb-Datei befindet.)
Procfile, requirements.txt, runtime.txt
Stellen Sie beim Überprüfen des Vorgangs auf Heroku sicher, dass Sie die Datei mnist.py verwenden Nennen Sie es main.py.
Da die Procfile angibt, eine Datei namens main.py zu starten Verwenden Sie diesmal main.py.
Sie können eine Datei mit einem beliebigen Namen starten, indem Sie Procfile neu schreiben.
Auch Anforderungen.txt
In Herokus eigener App schreiben Sie die notwendigen Bibliotheken für
Die Bibliothek wird installiert.
runtime.Beschreiben Sie die Version von Python, die in txt verwendet werden soll.
Im Verzeichnis (Ordner) main.py, Procfile, require.txt, runtime.txt Stellen Sie sicher, dass Sie über das trainierte Modell, den Vorlagenordner, den Statikordner und den Upload-Ordner verfügen.
~ In der Hierarchie mit der Anwendungsdatei des Terminals (Eingabeaufforderung) ~
git init(Dies ist nur das erste Mal)
heroku git:remote -a (App Name)
git add .
git commit -m “(Schreiben Sie eine Nachricht darüber, was sich geändert hat)”
git push heroku master
Bitte bereitstellen als.
Die bereitgestellte App hat die URL https: // app name.herokuapp.com/. Sie können auch den Befehl heroku open eingeben, um zu der URL zu gelangen, unter der die Web-App ausgeführt wird. Wenn Sie den Vorgang bestätigen können, ist die Bereitstellung erfolgreich.
Recommended Posts