Klicken Sie hier für Flask's Tutrial. Erstellen Sie einen Microblogging-Dienst namens Flaskr. Sqlite wird als Datenbank verwendet.
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]#
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]#
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
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'))
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 %}
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; }
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
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