Webanwendung mit Python + Flask ④

  1. Vorbereitung der Umgebung (Betriebssystem-Setup)
  2. Vorbereitung der Umgebung (Einrichtung im Betriebssystem)
  3. Verfolgen Sie den Inhalt von Flask's QuickStart (Installation und minimales Setup).
  4. Verfolgen Sie den Inhalt von Flask's Tutrial (lernen Sie, wie Sie eine Basisanwendung erstellen) ★
  5. Erstellen Sie den Originalinhalt

Klicken Sie hier für Flask's Tutrial. Erstellen Sie einen Microblogging-Dienst namens Flaskr. Sqlite wird als Datenbank verwendet.

Erstellen einer Ordnerstruktur

Erstellen Sie ein Verzeichnis, um die Anwendung zu platzieren. Der Name ist willkürlich, aber es ist besser, Statik und Vorlagen zu verwenden, da sie dem Standard entsprechen. (Vergessen Sie nicht, mit Vorlagen zu pluralisieren)

[root@cnenyuy5l3c ~]# mkdir flaskr
[root@cnenyuy5l3c ~]# cd flaskr
[root@cnenyuy5l3c flaskr]#
[root@cnenyuy5l3c flaskr]# mkdir templates static
[root@cnenyuy5l3c flaskr]#
[root@cnenyuy5l3c flaskr]# virtualenv env
New python executable in /root/flaskr/env/bin/python2.7
Also creating executable in /root/flaskr/env/bin/python
Installing setuptools, pip, wheel...done.
[root@cnenyuy5l3c flaskr]#
[root@cnenyuy5l3c flaskr]# ls
env  static  templates
[root@cnenyuy5l3c flaskr]#

Isolation der virtuellen Umgebung und Installation der Flasche

Aktivieren Sie virtualenv und installieren Sie dort den Kolben.

[root@cnenyuy5l3c flaskr]# . env/bin/activate
(env) [root@cnenyuy5l3c flaskr]#
(env) [root@cnenyuy5l3c flaskr]# pip install flask
Collecting flask
(Unterlassung)
Successfully installed Jinja2-2.9.5 MarkupSafe-0.23 Werkzeug-0.11.15 click-6.7 flask-0.12 itsdangerous-0.24
(env) [root@cnenyuy5l3c flaskr]#

DB-Erstellung

Erstellen Sie zunächst ein Schema.

schema.sql


drop table if exists entries;
create table entries (
  id integer primary key autoincrement,
  title string not null,
  text string not null
);

Dieses Schema wird nicht direkt gestreamt, sondern in Python modularisiert. Die folgende flaskr.py ist der Hauptteil der flaskr-Anwendung, aber hier wird nur der DB-Initialisierungsteil erstellt.

flaskr.py


import sqlite3
from flask import Flask, request, session, g, redirect, url_for, \
     abort, render_template, flash
from contextlib import closing    #Es war nicht offiziell hier, aber es war notwendig

# configuration
DATABASE = '/tmp/flaskr.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'

# create our little application :)
app = Flask(__name__)
app.config.from_object(__name__)

def connect_db():
    return sqlite3.connect(app.config['DATABASE'])

def init_db():
    with closing(connect_db()) as db:
        with app.open_resource('schema.sql') as f:  #Hier Schema.Führen Sie SQL aus
            db.cursor().executescript(f.read())
        db.commit()

#Hier werden verschiedene Ansichtsfunktionen hinzugefügt.

if __name__ == '__main__':
    app.run(host='0.0.0.0')  #Beziehen Sie sich auf andere als lokale Gäste

from_object ist eine Methode, die alle Großbuchstabenvariablen im Ziel liest. Das Ziel hier ist name, dh Ihre eigene Datei (flaskr.py). Im Original gibt die letzte app.run keine Option an, aber dieses Mal wird host = '0.0.0.0' als Referenz vom Host-Computer angegeben. Nachdem wir fertig sind, erstellen Sie eine Datenbank.

(flaskr) [root@localhost flaskr]# python
Python 2.7.12 (default, Jan  4 2017, 08:18:28)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from flaskr import init_db
>>> init_db()
>>>

Wenn hier der folgende Fehler angezeigt wird, fehlt sqlite3-devel beim Kompilieren von Python. Sie müssen es daher erneut installieren.

>>> from flaskr import init_db
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "flaskr.py", line 5, in <module>
    import sqlite3
  File "/opt/local/lib/python2.7/sqlite3/__init__.py", line 24, in <module>
    from dbapi2 import *
  File "/opt/local/lib/python2.7/sqlite3/dbapi2.py", line 28, in <module>
    from _sqlite3 import *
ImportError: No module named _sqlite3

Überprüfen Sie vorerst die erstellte Datenbank.

(env) [root@cnenyuy5l3c flaskr]# sqlite3 /tmp/flaskr.db
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
entries
sqlite>
sqlite> .schema
CREATE TABLE entries (
  id integer primary key autoincrement,
  title string not null,
  text string not null
);
sqlite> .quit

Erstellen einer Ansichtsfunktion

Fügen Sie hier Funktionen hinzu. Der erste ist der Prozess des Erstellens und Schließens einer Verbindung mit der Datenbank.

@app.before_request
def before_request():
    g.db = connect_db()

@app.after_request
def after_request(response):
    g.db.close()
    return response

g ist ein spezielles Objekt, das von flask bereitgestellt wird und die Verbindung zur aktuellen Datenbank speichert. (g speichert nur Informationen für eine Anfrage) before_request wird vor der Anfrage aufgerufen. Es gibt hier keine Argumente.

after_request wird nach der Anfrage aufgerufen. Hier wird die Verbindung geschlossen und die Antwort von der DB an den Client übergeben. Ist es in Ordnung, dies als Klischee zu betrachten? Geben Sie hier den Inhalt ein, der der tatsächlichen Seite entspricht. Grundsätzlich die Arbeit, die URL mit der vom Routendekorateur aufgerufenen Funktion zu verknüpfen.

@app.route('/')    # http://<hostname>:5000/Definieren Sie eine Funktion, die beim Zugriff aufgerufen werden soll(Routing)
def show_entries():
    cur = g.db.execute('select title, text from entries order by id desc')
    entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
    return render_template('show_entries.html', entries=entries)    # show_entries.Betten Sie die Werteinträge in HTML mit dem Namen html ein(Rendern)

@app.route('/add', methods=['POST'])
def add_entry():
    if not session.get('logged_in'):
        abort(401)
    g.db.execute('insert into entries (title, text) values (?, ?)',
                 [request.form['title'], request.form['text']])
    g.db.commit()
    flash('New entry was successfully posted')
    return redirect(url_for('show_entries'))    #Umleiten, wenn Sie zu einer Funktion springen möchten, anstatt zu rendern()verwenden.

@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)

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

HTML erstellen

Nachdem wir den Funktionsteil erstellt haben, fahren wir mit HTML (Erscheinungsbild) fort. Flask erstellt den ursprünglichen Basis-HTML-Code (häufig als layout.html bezeichnet) und erweitert ihn entsprechend.

layout.html


<!doctype html>
<title>Flaskr</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
<div class=page>
  <h1>Flaskr</h1>
  <div class=metanav>
  {% if not session.logged_in %}
    <a href="{{ url_for('login') }}">log in</a>
  {% else %}
    <a href="{{ url_for('logout') }}">log out</a>
  {% endif %}
  </div>
  {% for message in get_flashed_messages() %}
    <div class=flash>{{ message }}</div>
  {% endfor %}
  {% block body %}{% endblock %}    <!--Dieser Block wird als Referenz ersetzt-->
</div>

show_entries.html


{% extends "layout.html" %}    <!--Geben Sie den ursprünglichen HTML-Code an-->
{% block body %}    <!-- layout.Ersetzen Sie den HTML-Bodyblock durch:-->
  {% if session.logged_in %}
    <form action="{{ url_for('add_entry') }}" method=post class=add-entry>
      <dl>
        <dt>Title:
        <dd><input type=text size=30 name=title>
        <dt>Text:
        <dd><textarea name=text rows=5 cols=40></textarea>
        <dd><input type=submit value=Share>
      </dl>
    </form>
  {% endif %}
  <ul class=entries>
  {% for entry in entries %}
    <li><h2>{{ entry.title }}</h2>{{ entry.text|safe }}
  {% else %}
    <li><em>Unbelievable.  No entries here so far</em>
  {% endfor %}
  </ul>
{% endblock %}

login.html


{% extends "layout.html" %}
{% block body %}
  <h2>Login</h2>
  {% if error %}<p class=error><strong>Error:</strong> {{ error }}{% endif %}
  <form action="{{ url_for('login') }}" method=post>
    <dl>
      <dt>Username:
      <dd><input type=text name=username>
      <dt>Password:
      <dd><input type=password name=password>
      <dd><input type=submit value=Login>
    </dl>
  </form>
{% endblock %}

CSS erstellen

Erstellen Sie abschließend eine CSS-Datei.

style.css


body            { font-family: sans-serif; background: #eee; }
a, h1, h2       { color: #377BA8; }
h1, h2          { font-family: 'Georgia', serif; margin: 0; }
h1              { border-bottom: 2px solid #eee; }
h2              { font-size: 1.2em; }

.page           { margin: 2em auto; width: 35em; border: 5px solid #ccc;
                  padding: 0.8em; background: white; }
.entries        { list-style: none; margin: 0; padding: 0; }
.entries li     { margin: 0.8em 1.2em; }
.entries li h2  { margin-left: -1em; }
.add-entry      { font-size: 0.9em; border-bottom: 1px solid #ccc; }
.add-entry dl   { font-weight: bold; }
.metanav        { text-align: right; font-size: 0.8em; padding: 0.3em;
                  margin-bottom: 1em; background: #fafafa; }
.flash          { background: #CEE5F5; padding: 0.5em;
                  border: 1px solid #AACBE2; }
.error          { background: #F0D6D6; padding: 0.5em; }

Starten, testen

Platzieren Sie die obigen Dateien wie folgt.

Wenn möglich, starten Sie die Anwendung und überprüfen Sie den Zugriff.

(env) [root@cnenyuy5l3c flaskr]# python flaskr.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger pin code: 602-691-323

20170131_009.jpg 20170131_010.jpg 20170131_011.jpg

Es scheint kein Problem zu geben. Damit wurden die minimalen Grundlagen unterdrückt (sollten), daher plane ich, ab dem nächsten Mal zum Original überzugehen.

Recommended Posts

Webanwendung mit Python + Flask ④
Entwicklung von Webanwendungen mit Flask
Anwendungsentwicklung mit Docker + Python + Flask
Analysieren und visualisieren Sie JSON (Webanwendung ⑤ mit Python + Flask)
[Python] Eine schnelle Webanwendung mit Bottle!
Einfache Web-App mit Python + Flask + Heroku
Führen Sie eine Python-Webanwendung mit Docker aus
Programmieren mit Python Flask
Webanwendung mit Python + Flask (unter Verwendung von VScode) # 1 - Aufbau einer virtuellen Umgebung-
Starten Sie einen Webserver mit Python und Flask
Web Scraping mit Python + JupyterLab
Erstellen Sie eine Webanwendung mit Django
Web-API mit Python + Falcon
Web Scraping Anfänger mit Python
Optimieren Sie die Websuche mit Python
Starten Sie mit Docker eine Python-Webanwendung auf Nginx + Gunicorn
Webanwendung erstellt mit Python3.4 + Django (Teil.1 Umgebungskonstruktion)
Kurs zur Erstellung von Webanwendungen, der mit Flask of Python Teil 2 Kapitel 1 ~ JSON-Austausch ~ gelernt wurde
Mit Flask erstellte SNS Python-Grundlagen
Erstellen einer Webanwendung mit Flask ②
Erste Schritte mit Python-Webanwendungen
Web Scraping mit Python Erster Schritt
Ich habe versucht, WebScraping mit Python.
Überwachen Sie die Leistung von Python-Anwendungen mit Dynatrace ♪
Holen Sie sich Web-Screen-Capture mit Python
Erstellen Sie eine Webanwendung mit Django
Erstellen einer Webanwendung mit Flask ①
Erstellen einer Webanwendung mit Flask ③
Erstellen einer Webanwendung mit Flask ④
Anwendung von Python: Datenbereinigung Teil 2: Datenbereinigung mit DataFrame
Python x Flask x Tensorflow.Keras Web-App, die Katzenrassen vorhersagt 2
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
Webanwendung mit Python3.3.1 + Flasche (1) - Ändern Sie die Vorlagen-Engine in jinja2
[Python] Webanwendung von 0! Hands-on (2) -Hallo Welt-
[Python] Webanwendung von 0! Hands-on (3) -API-Implementierung-
FizzBuzz in Python3
Scraping mit Python
Die erste künstliche Intelligenz. Fordern Sie die Webausgabe mit Python heraus. ~ Kolbeneinführung
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 1 erstellen
Statistik mit Python
Versuchen Sie es mit dem Webanwendungsframework Flask
Scraping mit Python
Python mit Go
Erstellen Sie mit Chalice eine flaschen- / flaschenähnliche Webanwendung auf AWS Lambda
Python x Flask x PyTorch Einfacher Aufbau einer Webanwendung zur Nummernerkennung
Erste Schritte mit Python Web Scraping Practice
POST verschieden mit Python und empfange mit Flask
Twilio mit Python
Lassen Sie uns eine WEB-Anwendung für das Telefonbuch mit Flasche Teil 2 erstellen
Spielen Sie mit 2016-Python
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Getestet mit Python
Einstellungen der Kolbenanwendung