[Memo zur Flask-Edition] Ein Amateur, der HTML oder Webkonstruktion nicht versteht, versucht, mit Python + Flask einen Webdienst zu erstellen

Dies ist ein Wochenendingenieur eines unerfahrenen Halsamateurs Dies ist ein Memo-Artikel zum Erstellen einer Webanwendung mit Python und Flask.

Landing Page [Flasche] Diese Seite [Docker] Coming Soon… [Webentwicklung] http://qiita.com/yuusei/items/cf738b0849fc932a64e6

Diese Seite ist die Hauptseite der Flask Edition, Die für die Implementierung verwendeten Inhalte, z. B. die Verwendung von Modulen und Klassen, basieren hauptsächlich auf der offiziellen japanischen Website von Flask. Diese Site verfügt über Github-Code "flaskr.py", mit dem Sie einen Dienst erstellen können, indem Sie ihn einfach kopieren und einfügen. Dann, besonders in Tutorial, einem Microblog (ein einfaches Blog mit nur Titel und Text. Twitter Tweet), dessen Beispielcode veröffentlicht wird. Es ist, als würde man den Code lesen (der für jeden einen Titel hat) und organisieren, was man verstehen kann.

Beachten Sie, dass die kleinste Web-App, die Sie mit Flask erstellen können eine App „Hello World“ mit nur 9 Zeilen enthält. Sie können es sofort durch Kopieren tun, also versuchen Sie es bitte.

Flasche Grundwissen Memo

・ Was ist Flask? Mikroframework für die Webentwicklung ・ Ein Framework ist wie eine "Spielzeugkiste" ・ "Spielzeug" im Beratungsrahmen sind strategische Systeme wie "SWOT-Analyse" ・ "Spielzeug" im Framework für Web-Ersteller ist eine Bibliothek, in der viele Leute Code geschrieben haben. ・ Für jede Entwicklungssprache gibt es Web-Frameworks, ebenso wie das Framework für die Beratung je nach Unternehmen oder Branche unterschiedlich ist. ・ Für Python ist "Django" der Mainstream. Es ist ein All-in-One-Framework, das mittelgroße Frameworks verarbeiten kann.

Liste der minimal erforderlichen Module in Flask

"Kolben" -Modul ・ Keine Erklärung erforderlich. Ein Modul, mit dem Sie Flask verwenden können.

nur das. Es scheint, dass Sie mit nur dieser "Flasche" eine minimale Webanwendung erstellen können. Referenz: Minimale Web-App, die mit Flask erstellt werden kann

Nun, es sind zwei weitere Module erforderlich, um eine Microblogging-App unter [Tutorial] zu erstellen (https://flask-docs-ja.readthedocs.io/en/latest/tutorial/). "Os" -Modul

Modul "Sqlite3" -Ein Modul zum Anschließen und Betreiben der DB.

(Es ist mir egal, aber als ich diesen Artikel schrieb, hörte ich ein Gespräch mit der Aufschrift "Ich dachte, ich könnte dieses SQL nicht schreiben" und war für einen Moment schockiert.)

Nutzen Sie dann die Klassen in diesen Modulen vollständig, um eine Microblog-Anwendung zu erstellen.

Liste der im Flask-Modul gespeicherten Nicht-Flask-Modulklassenbibliotheksobjekte (im Lernprogramm verwendet)

“Flask” -Eine Klasse für die Verwendung von Flask. -Für eine Erklärung zum Erstellen einer Anwendung. ・ Wird mit app = Flask (name) usw. verwendet.

“request” -Befehlsbibliothek für den Umgang mit in Python installiertem HTML ・ Es scheint, dass es erstellt wurde, weil urllib schwer zu verstehen ist

“session” -Es scheint für die Verwaltung der An- und Abmeldung zu sein.

“g” -Ein Objekt, in dem die ursprüngliche DB-Verbindung des Flask gespeichert ist

“redirect” ・ [HTTP-Umleitung](http://e-words.jp/w/HTTP Redirect.html) ・ Hinweis auf URL-Änderung

“url_for” -Für das Generieren von URLs. -Es scheint, dass es auch für [Dynamische URL-Generierung] verwendet werden kann (http://stackoverflow.com/questions/7478366/create-dynamic-urls-in-flask-with-url-for). Es scheint genau richtig zu sein, um meine Seite für neue Benutzer zu erstellen.

“abort”

“render_template” -Für das Aufrufen der erforderlichen Vorlage aus der Vorlage und Rendern = Lesen des Programmcodes als Bild ・ Ich habe mich gefragt, ob es von Jinja2 [hier] stammt (http://kuroneko0208.hatenablog.com/entry/2013/11/27/043038).

“flash” -Wie man Flash anzeigt und dem Client Zeichen / Bilder liefert

So ein Ort. Damit ist flaskr.py für flaskr selbst abgeschlossen.

Verzeichnisaufbau

Im Web Development Web Service Directory Structure Memo,

・ Es gibt keine optimale Struktur. Es gibt nur Stammverzeichnis (/)

Flask erstellt die Verzeichnisstruktur wie folgt ).

-Folder-Speicherordner "/ flaskr" zum Speichern des Hauptmoduls und des Datenbankschemas ・ CSS und JS werden direkt unter dem Ordner "flask" abgelegt, und der Ordner "/ static" wird von Benutzern verwendet. ・ Ebenso ein Ordner "/ templates" für die Suche nach Jinja2-Vorlagen direkt unter "flaskr"

Dort sind drei. Darüber hinaus einschließlich der erforderlichen Dateien Die Verzeichnisstruktur ist wie folgt.

Flaskr_DirectryTree.png

Informationen zum Datenbankdesign (Schema)

Für die in Tutorial enthaltene Microblogging-App ist nur eine Tabelle erforderlich.

Fügen Sie dem Befehl zum Erstellen eines Tutorial-Datenbankschemas (https://flask-docs-ja.readthedocs.io/en/latest/tutorial/schema/#tutorial-schema) einen Inline-Kommentar hinzu.

drop table if exists entries;

Wenn Sie bereits eine Tabelle mit dem Namen "Einträge" haben, löschen Sie diese

#Methoden zum Erstellen einer neuen Tabelle create table entries ( Erklärung zum Erstellen einer Tabelle mit dem Namen "Einträge" mit dem in # {} geschriebenen Inhalt; automatische Inkrementierung des Primärschlüssels id integer, #column ”id” Wird als Primärschlüssel vom Typ Integer verwendet (automatische Nummerierung) Titelzeichenfolge nicht null, # Definition der Spalte "Titel" als Zeichenfolge. Nullwert ist nicht möglich Textzeichenfolge nicht null # Definieren Sie die Spalte "Text" als Zeichenfolge. Nullwert ist nicht möglich );

Wenn Sie sich zuerst die fertige Benutzeroberfläche dieses Dienstes ansehen, sehen Sie wie folgt aus.

flaskr_top_image.png

Wenn Sie hier den Titel und den Text eingeben, wird die ID durch automatische Nummerierung zugewiesen und dann Sie können sehen, dass der Beitrag reflektiert wird.

Wenn Sie diesen Bildschirm beispielsweise erweitern möchten, um das Buchungsdatum wiederzugeben, Fügen Sie vorab einen Satz in das obige Schema ein und bereiten Sie ein Feld für das Datum der automatischen Inkrementierung in der Tabelle vor.

Dieses Schema wird als "schema.sql" -Datei direkt im flaskr-Verzeichnis gespeichert.

Erklärung für jeden Teil des Hauptteils "flaskr.py"

Ich habe die Einstellungsdatei der Anwendung als flaskr.py in dieselbe Hierarchie eingefügt (direkt unter flaskr). Ebenso werde ich Kommentare inline hinzufügen.

App-Deklaration und Konfiguration

""" create our little application :)""" app = Flask(name) #Erstellen Sie eine Instanz (diesmal WSGI) mit dem Namen "name" aus der importierten Flask-Klasse

Wenn Sie es als einzelnes Modul verwenden, setzen Sie es auf "Name", damit es das "Haupt" des Importziels nicht beeinträchtigt.

# Load default config and override config from an environment variable app.config.update(dict(

Deklariert, um die Konfiguration der App im Diktatformat zu definieren

DATABASE = os.path.join (app.root_path, 'flaskr.db'), #DB verwendet den Stammpfad "flaskr.db" DEBUG = True, #Debug SECRET_KEY = 'Entwicklungsschlüssel', # Schlüssel, um clientseitige Sitzungen sicher zu halten USERNAME = 'admin', # Name, der mit Administratorrechten eingegeben werden soll PASSWORD = 'default' # PW zur Eingabe mit Administratorrechten )) app.config.from_envvar('FLASKR_SETTINGS', silent=True) Code, auf den verwiesen wird, wenn #config in einer separaten Datei gespeichert wird Übergeben Sie nichts, was nicht mit # quiet = True to Flask festgelegt ist.

Damit sind die Einstellungen abgeschlossen. Als nächstes der Befehl zum Herstellen einer Verbindung mit der Datenbank

DB-Verbindung und Initialisierung

def connect_db(): Definieren Sie die Funktion, die eine Verbindung zu #DB herstellt, als "connect_db". #Verbinden, Format mit Daten in taple-> dict ändern und Zeile vom Typ dict als rv zurückgeben """Connects to the specific database.""" rv = sqlite3.connect (app.config ['DATABASE']) Stellen Sie eine Verbindung zu der in # app.config festgelegten Datenbank her rv.row_factory = sqlite3.Row # Zeile kann im Diktatformat anstelle von Taple gehalten werden return rv

Verwenden Sie diese vordefinierte Funktion "connect_db", um "init_db" zu definieren, das die Datenbank vor einer neuen Verbindung einmal initialisiert.

def init_db(): """Initializes the database.""" db = get_db () # db speichert die Datenbank als Variable mit app.open_resource ('schema.sql', mode = 'r') als f: # Speichern Sie das Schema im schreibgeschützten Modus in "f" Verwenden Sie db.cursor (). Executescript (f.read ()) # f.read () als SQL und speichern Sie es als Cursor db.commit () #commit to db-> initialisiert

Siehe Klicken Sie hier für SQL-Cursor. Der Cursor scheint eine Funktion zu sein, mit der Sie Daten in SQL zeilenweise verarbeiten können. Lesen Sie jedoch einfach die SQL Select-Anweisung durch cursor (). Lesen Sie die Erklärung zum Cursor von spliete3. Ich habe das Gefühl, Executescript zu verwenden. Um diese Funktion init_db () in CUI verwenden zu können, ist übrigens das folgende Gerät erforderlich.

@ app.cli.command ('initdb') # Fügen Sie der Befehlszeilenschnittstelle den neuen Befehl "initdb" hinzu def initdb_command (): Geben Sie # initdb ein, um die Funktion init_db () aufzurufen und "initialisiert" zu werden. """Creates the database tables.""" init_db() print('Initialized the database.')

Jetzt haben Sie eine Umgebung zum Initialisieren der Datenbank über die CUI (ist es praktisch, eine Testumgebung zu haben?). Und theoretisch habe ich keine Funktion zum Herstellen einer Verbindung mit der Datenbank definiert, daher werde ich sie definieren.

def get_db(): """Opens a new database connection if there is none yet for the current application context. """ if not hasattr(g, 'sqlite_db'): g.sqlite_db = connect_db() return g.sqlite_db

Wenn diese Funktion zum ersten Mal eine Verbindung zur Datenbank herstellt, werden die Einstellungen gespeichert und die Aufgabe "Herstellen einer Verbindung zur Datenbank für jede Anforderung" ausgeführt. Zum Beispiel verweise ich auf diesen Bereich. Und wir definieren die Trennung unten, indem wir sagen, dass wir die Verbindung trennen müssen, sobald wir eine Verbindung herstellen.

@app.teardown_appcontext def close_db(error): """Closes the database again at the end of the request.""" if hasattr(g, 'sqlite_db'): g.sqlite_db.close()

Es spielt keine Rolle, aber zuerst wusste ich nicht, was dieses Hasattr ist, aber es sieht aus wie eine eingebaute Funktion in Python.

The arguments are an object and a string. The result is True if the string is the name of one of the object’s attributes, False if not. (This is implemented by calling getattr(object, name) and seeing whether it raises an exception or not.) from Python-Official

Es wird von hasattr (Objekt, Name) verwendet und scheint True zurückzugeben, wenn der Name im Objekt enthalten ist. In diesem Fall scheint sqlite_db, wenn es geöffnet ist (verbunden wurde), durch g.sqlite_db.close () geschlossen zu werden. Initdb für get_db () und close_db () ist das Ende der db-bezogenen Verarbeitung.

Funktion anzeigen / anmelden / abmelden

Definieren Sie als Nächstes vier Ansichtsfunktionen, um den Inhalt der Datenbank (gebuchte Inhalte) auf dem Bildschirm der Anwendung anzuzeigen. "Alle Einträge anzeigen", "Neuen Eintrag hinzufügen", "Anmelden" bzw. "Abmelden".

Dann eins nach dem anderen ... Ich werde es schnell beenden.

(Alle) Eingabeanzeige

@app.route('/') def show_entries(): db = get_db() cur = db.execute('select title, text from entries order by id desc') entries = cur.fetchall() return render_template('show_entries.html', entries=entries)

Was ich hier sehen möchte, ist "cur = db.execute ('Titel, Text aus Einträgen auswählen, sortiert nach ID desc')". Wenn Sie SQL verstehen, können Sie es leicht verstehen, aber dieser Befehl () enthält SQL. Execute ("SQL-Anweisung") führt also SQL in DB aus.

select title , text from entries order by id desc

Vielleicht hat es etwas mit der Cursor-Anweisung zu tun, die ich vor einiger Zeit geschrieben habe (db.cursor (). Executescript (f.read ())). Auf jeden Fall wird dies neu geschrieben und das von "fetchall ()" abgerufene Element wird von "render_template" gerendert. Die Rendering-Regeln sind in "show_entries.html" definiert. Wenn Sie als erweiterte Version das Datum abrufen möchten, müssen Sie dem DB-Schema und der obigen SQL "Datum" hinzufügen und "show_entries.html" neu schreiben, um das Datum anzuzeigen.

Neuen Eintrag hinzufügen

@app.route('/add', methods=['POST']) def add_entry(): if not session.get('logged_in'): abort(401) db = get_db() db.execute('insert into entries (title, text) values (?, ?)', [request.form['title'], request.form['text']]) db.commit() flash('New entry was successfully posted') return redirect(url_for('show_entries'))

Als Funktion wird der folgende Ablauf als Funktion add_entry () definiert.

"401 zurückgeben, wenn nicht angemeldet" -> "Verbindung zur Datenbank herstellen, wenn angemeldet" -> "Führen Sie den Befehl aus, um" Titel "und" Text "als neue Einträge in der verbundenen Datenbank einzugeben." -> "Verarbeitung mit commit () bestätigen" -> "Flash-Anzeige, dass der Eintrag veröffentlicht wurde" -> "Laden Sie den Browser neu und rufen Sie" show_entries "auf, um alles neu anzuzeigen"

ist.

Einloggen

@app.route('/login', methods=['GET', 'POST']) def login(): error = None if request.method == 'POST': if request.form['username'] != app.config['USERNAME']: error = 'Invalid username' elif request.form['password'] != app.config['PASSWORD']: error = 'Invalid password' else: session['logged_in'] = True flash('You were logged in') return redirect(url_for('show_entries')) return render_template('login.html', error=error)

Als Funktion wird der folgende Ablauf als login () -Funktion definiert.

"Keine Fehlerbehandlung" -> "Überprüfen Sie, ob POST angefordert wird" -> "Überprüfen Sie, ob der Benutzername in der vorhandenen Benutzerliste enthalten ist (Rückgabefehler, falls nicht)" -> "Überprüfen Sie, ob PW in vorhandenem PW vorhanden ist (Rückgabefehler, falls nicht)" -> "Anmeldesitzung auf True setzen" -> "Flash-Anmeldeerfolg" -> "Laden Sie den Browser neu und rufen Sie" show_entries "auf, um alles neu anzuzeigen" (-> Wenn die Fehlerbehandlung nicht Keine ist, wird der Bildschirm zum Zeitpunkt des Anmeldefehlers aus der Vorlage gerendert.)

ist.

Ausloggen

@app.route('/logout') def logout(): session.pop('logged_in', None) flash('You were logged out') return redirect(url_for('show_entries'))

Als Funktion wird der folgende Ablauf als logout () -Funktion definiert.

"Logged_in auf None zurücksetzen" -> "Show" abgemeldet "in Flash" -> "Laden Sie den Browser neu und rufen Sie" show_entries "auf, um alles neu anzuzeigen"

ist. Überraschend einfach.

Dies umfasst den Inhalt von flaskr.py. Der Rest handelt von HTML, anstatt es hier zu schreiben Ich werde einen Link zum HTML- und CSS-Frame in Web Development einfügen.

Fortsetzen···

Andere Web-Framework einfache Notizen ・ Für Ruby "Ruby on Rails". Die Geschwindigkeit der Entwicklung verkauft sich ・ Für PHP "CakePHP". In der Welt scheint es, dass "die meisten Web-Apps eingeführt wurden" ・ Für Java "Spring" oder "Play". Es scheint, dass es sich um eine Auswahlphase aus der Gruppe der männlichen Männer handelt ・ Für JavaScript "AngularJS". Es scheint, dass es für die Anwendungsentwicklung geeignet ist, die mit einem Stück abgeschlossen werden kann. Ist es eine Dia-Geschichte? -Für CSS / JS "Bootstrap". Es scheint, dass Twitter bietet

Recommended Posts

[Memo zur Flask-Edition] Ein Amateur, der HTML oder Webkonstruktion nicht versteht, versucht, mit Python + Flask einen Webdienst zu erstellen
Erstellen Sie einen Webdienst mit Docker + Flask
Erstellen Sie mit Mecab aus Python3 ein Tool, das Furigana automatisch mit HTML schüttelt
[GCP] Verfahren zum Erstellen einer Webanwendung mit Cloud-Funktionen (Python + Flask)
Eine Einführung in selbst erstellte Python-Webanwendungen für einen trägen Webingenieur im dritten Jahr
Memo, um nach KPI mit Python zu fragen
Erstellen Sie eine einfache Web-App mit Flasche
[Python] Erstellen Sie schnell eine API mit Flask
Lassen Sie uns mit Flask eine Webanwendung zur Konvertierung von A nach B erstellen! Von Grund auf neu ...
Auf der Suche nach einer effizienten Möglichkeit, eine Docker-Datei mit Python mit Gedichten zu schreiben
[Python] So erstellen Sie eine lokale Webserverumgebung mit SimpleHTTPServer und CGIHTTPServer
Erstellen Sie mit Minette für Python einen LINE BOT
Schritte zum Erstellen eines Twitter-Bots mit Python
Starten Sie einen Webserver mit Python und Flask
Python Amateur versucht die Liste zusammenzufassen ②
Umgebungskonstruktion für diejenigen, die Python einfach mit VSCode (für Mac) lernen möchten
Erstellen Sie mit Python + Flask einen animierten lokalen GIF-Server
Memo zum Erstellen einer eigenen Box mit Peppers Python
Memo mit Python mit HiveServer2 von EMR verbunden
Warum nicht einfach mit Python eine stilvolle Tabelle erstellen?
[Python] Ein Memo zum vertikalen Schreiben von CSV mit Pandas
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Für diejenigen, die Python mit vim schreiben möchten
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
Verfahren zur Erstellung der Umgebung für diejenigen, die mit dem Python-Versionsverwaltungssystem nicht vertraut sind
Fortsetzung [Python] Lassen Sie uns automatisch englische PDF-Dateien (ohne darauf beschränkt zu sein) mit DeepL- oder Google-Übersetzung in eine Textdatei ohne HTML übersetzen.