Dieses Mal wird die Erstellung des Bulletin Boards beschrieben, indem es in die folgenden sechs Kategorien eingeteilt wird. (1) Umweltbau (2) Bulletin Board mit CSV (3) Bulletin Board mit SQL und SQL Alchemy (4) Bulletin Board mit PostgreSQL und SQL Alchemy (5) Datenmanipulation mit SQLAlchemy (6) Datenmanipulation mit Postgresql
Erstellen Sie einen Verzeichnis-Test auf Ihrem Desktop. Erstellen Sie im Test eine virtuelle Umgebung und starten Sie sie.
python3 -m venv .
source bin/activate
Installieren Sie das erforderliche Framework und den Webserver.
pip install flask
pip install gunicorn
Erstellen Sie zunächst ein Bulletin Board mit csv in der lokalen Umgebung.
test
├app.py
├articles.csv
├Procfile
├requirements.txt
└templates
├index.html
├layout.html
└index_result.html
Erstellen Sie articles.csv und geben Sie die folgenden Daten aus Sicht der Verständlichkeit im Voraus ein.
Marmor,Schläfrig
Weiß,Ich bin hungrig
Schwarz,Irgendwie warm
Marmor,Poe Poe Poe
Pontan,Kein Klopapier
Naochin,Kette
.py:app.py
#coding: utf-8
from flask import Flask,request,render_template
app = Flask(__name__)
@app.route('/')
def bbs():
lines = []
#mit Öffnen, um die CSV-Datei zu lesen
with open('articles.csv',encoding='utf-8') as f:
lines = f.readlines() #readlines gibt den Inhalt von csv im Listenformat zurück
#index.Kehren Sie zu HTML zurück
return render_template('index.html',lines=lines)
#Post-Methode erhalten
@app.route('/result',methods=['POST'])
def result():
#Holen Sie sich den Wert des Artikels und des Namens auf Anfrage
article = request.form['article']
name = request.form['name']
#Schreiben Sie im Überschreibmodus in eine CSV-Datei
with open('articles.csv','a',encoding='utf-8') as f:
f.write(name + ',' + article + '\n')
#index_result.Kehren Sie zu HTML zurück
return render_template('index_result.html',article=article,name=name)
if __name__ == '__main__':
app.run(debug=False)
.html:index.html
{% extends 'layout.html' %}
{% block content %}
<h1>Nyanko Bulletin Board</h1>
<form action='/result' method='post'>
<label for='name'>Nyankos Name</label>
<input type='text' name='name'>
<p></p>
<label for='article'>Post</label>
<input type='text' name='article'>
<button type='subimit'>Schreiben</button>
</form>
<p></p>
<p></p>
<table border=1>
<tr><th>Nyankos Name</th><th>Geposteter Inhalt</th></tr>
{% for line in lines: %}
<!--Setzen Sie eine Variable namens column (set ist für jinja2 variable set erforderlich)-->
<!--Split verwenden,Klassifizieren nach. split gibt eine Liste zurück-->
{% set column = line.rstrip().split(',') %}
<tr><td>{{column[0]}}</td><td>{{column[1]}}</td></tr>
{% endfor %}
</table>
{% endblock %}
.html:layout.html
<!DOCTYPE html>
<html lang='ja'>
<head>
<meta charset='utf-8'>
<title>Nyanko BBS</title>
<style>body{padding:10px;}</style>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
index_result.html
{% extends 'layout.html' %}
{% block content %}
<h1>Nya-Ich schrieb an die Pinnwand</h1>
<p>{{name}}{{article}}</p>
<!--informieren/Zurück zu-->
<form action='/' method='get'>
<button type='submit'>Rückkehr</button>
</form>
{% endblock %}
Stellen Sie nach dem Testen in der lokalen Umgebung eine Bereitstellung für Heroku bereit. Die Details der Bereitstellung in Heroku sind wie im folgenden Artikel beschrieben, daher werde ich nur das Wesentliche verwenden und die ausführliche Erklärung weglassen. Hochladen mit Heroku, Flask, Python, Git (Teil 2) Hochladen mit Heroku, Flask, Python, Git (3) Melden Sie sich bei Heroku an und erstellen Sie eine App auf Heroku
heroku login
Der App-Name lautet cat-bbs.
Heroku create cat-bbs
Initialisieren Sie die Verzeichnis-App.
git init
Heroku mit der lokalen Umgebung verbinden,
heroku git:remote -a cat-bbs
Erstellen Sie die Anforderung.txt in der Verzeichnis-App
pip freeze > requirements.txt
Erstellen Sie eine Procfile in der Verzeichnis-App und geben Sie Folgendes ein. Zu diesem Zeitpunkt ist vor g ein Leerzeichen erforderlich, und die App vor: app bedeutet App in app.py. Seien Sie also vorsichtig (form: app for form.py).
web: gunicorn app:app --log-file -
Alles hinzufügen,
git add .
Dieses Mal mit dem Namen the-first festschreiben,
git commit -m'the-first'
Schieben Sie zu Heroku.
git push heroku master
Schließlich,
heroku open
Als ich den Befehl zum Öffnen von Heroku eingab, wurde der Browser gestartet und Folgendes wurde angezeigt. Wenn Sie den Namen Nyanko als "Iwashi" und den Inhalt des Beitrags als "Ich liebe Fisch" posten, Es wurde ordnungsgemäß am Schwarzen Brett veröffentlicht. In Heroku verschwindet die geschriebene CSV nach einer bestimmten Zeit (30 Minuten), sodass wir mit dem Einbetten der Datenbank beginnen.
test
├app.py
├articles.csv
├Procfile
├requirements.txt
├assets
│ ├init.py
│ ├database.py
│ └models.py
│
└templates
├index.html
├layout.html
└index_result.html
SQLAlchemy ist eines der beliebtesten ORMs in Python. Überprüfen Sie zunächst die Version von sqlite3 (Mac) und installieren Sie sqlalchemy.
sqlite3 --version
pip install sqlalchemy
Erstellen Sie in app.py außerdem init.py im Assets-Ordner als Datei, die zum Lesen von database.py und models.py als Module erforderlich ist (beachten Sie, dass ein Unterstrich hinzugefügt wird).
touch __init__.py
Erstellen Sie die folgenden zwei Dateien im Assets-Ordner.
database.py ・ ・ ・ Datei, die definiert, welche Datenbank verwendet werden soll, z. B. SQLite und MySQL models.py ・ ・ ・ Eine Datei, die definiert, welche Art von Informationen in die Datenbank gestellt werden Erstens lautet database.py wie folgt.
.py:database.py
#coding: utf-8
#database.py/Datei, die die anfänglichen Einstellungen der zu verwendenden Datenbank verarbeitet, z. B. SQLite
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session,sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import datetime
import os
#data_Benannt db, Datenbank.Wo py ist (os.path.dirname(__file__)), Mit einem absoluten Pfad (os.path.abspath)、data_Speichern Sie db
database_file = os.path.join(os.path.abspath(os.path.dirname(__file__)),'data.db')
#Verwenden der Datenbank sqlite (engin)、database_Daten in Datei gespeichert_Verwenden Sie db und geben Sie sqlite aus, wenn Sie mit echo (echo) arbeiten=True)
engine = create_engine('sqlite:///' + database_file,convert_unicode=True,echo=True)
db_session = scoped_session(
sessionmaker(
autocommit = False,
autoflush = False,
bind = engine
)
)
#declarative_Erstellen Sie eine Instanz von base
Base = declarative_base()
Base.query = db_session.query_property()
#Funktion zum Initialisieren der Datenbank
def init_db():
#Importieren Sie Modelle in den Assets-Ordner
import assets.models
Base.metadata.create_all(bind=engine)
Als nächstes lautet models.py wie folgt. Hier werden das Datum und die Uhrzeit der Veröffentlichung auch am Schwarzen Brett angezeigt.
.py:models.py
#coding: utf-8
from sqlalchemy import Column,Integer,String,Boolean,DateTime,Date,Text
from assets.database import Base
from datetime import datetime as dt
#Informationen zur Datenbanktabelle
class Data(Base):
#Einstellungen für Tabellennamen,Auf Namen benennen
__tablename__ = "data"
#Setzen Sie die Spalteninformationen und setzen Sie sie eindeutig auf False (was bedeutet, dass der gleiche Wert akzeptiert wird).
#Der Primärschlüssel wird bei der Suche nach einer normalerweise festgelegten Zeile benötigt
id = Column(Integer,primary_key=True)
#Name ist das Plakat
name = Column(Text,unique=False)
#Artikel ist der gepostete Inhalt
article = Column(Text,unique=False)
#Der Zeitstempel ist das Datum und die Uhrzeit der Buchung
timestamp = Column(DateTime,unique=False)
#initialisieren
def __init__(self,name=None,article=None,timestamp=None):
self.name = name
self.article = article
self.timestamp = timestamp
Die folgenden beiden sind erforderlich, um die Datenbank zu erstellen oder zu löschen. Importieren Sie sie daher. Importieren Sie die Variable de_session aus dem Datenbankmodul im Assets-Ordner und die Datenklasse aus dem Modellmodul im Assets-Ordner.
from assets.database import db_session
from assets.models import Data
Es ist erforderlich, die Werte von Artikel und Name aus index.html abzurufen. Darüber hinaus ist es erforderlich, das Datum und die Uhrzeit (zum Zeitpunkt des Schreibens) zum Zeitpunkt des Erwerbs jedes Werts mit today () zu erfassen und der Variablen today zuzuweisen. Insbesondere ist es wie folgt.
article = request.form['article']
name = request.form['name']
today = datetime.datetime.today()
Die oben genannten Inhalte müssen in einer Zeile gespeichert und mit db_session und de_commit in die Datenbank geschrieben werden. Insbesondere ist es wie folgt.
row = Data(name=name,article=article,timestamp=today)
db_session.add(row)
db_session.commit()
Um Daten aus der Datenbank zu lesen, können Sie sie mit db_session.query (Data) .all () abrufen. Wenn Sie beispielsweise Folgendes schreiben, um den Wert in der Datenbank abzurufen,
db_session.query(Data.name,Data.article,Data.timestamp).all()
Ausgabe im Listenformat wie unten gezeigt * (Zum besseren Verständnis wird davon ausgegangen, dass mehrere Beiträge am Schwarzen Brett veröffentlicht und in der Datenbank gespeichert werden.) *
('Mike', 'Heute ist es sonnig', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
('Weiß', 'Es regnet morgen', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
('Schwarz', 'Warm', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
('Pontan', 'Nya Nya Crow ist ein Papierflugzeug', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
('Weiß', 'Mein Rücken schmerzt', datetime.datetime(2020, 3, 13, 0, 7, 46, 513144)),
('Mike', 'Was ist es?', datetime.datetime(2020, 3, 13, 0, 8, 57, 193710)),
('Schwarz', 'Warm', datetime.datetime(2020, 3, 13, 0, 9, 42, 45228)),
('Mike', 'Heute bewölkt', datetime.datetime(2020, 3, 13, 0, 17, 13, 709028)),
('Boo Taro', 'Heute regnet es den ganzen Tag', datetime.datetime(2020, 3, 14, 13, 26, 29, 438012)),
Es ist erforderlich, den Inhalt der in index.html eingelesenen Datenbank zurückzugeben. Insbesondere ist es wie folgt.
data = db_session.query(Data.name,Data.article,Data.timestamp).all()
return render_template('index.html',data=data)
Das Folgende ist eine Zusammenfassung der Änderungen, die bisher für app.py als Ganzes vorgenommen wurden.
.py:app.py
#coding: utf-8
from flask import Flask,request,render_template
import datetime
#Wird bei Verwendung der Datenbank hinzugefügt
from assets.database import db_session
from assets.models import Data
app = Flask(__name__)
@app.route('/')
def bbs():
#Aus Datenbank lesen
data = db_session.query(Data.name,Data.article,Data.timestamp).all()
#index.Kehren Sie zu HTML zurück
return render_template('index.html',data=data)
#Post-Methode erhalten
@app.route('/result',methods=['POST'])
def result():
#Holen Sie sich den Wert des Artikels und des Namens auf Anfrage
article = request.form['article']
name = request.form['name']
#Weisen Sie der Variablen das Datum und die Uhrzeit zu, zu der die Post-Methode von der Today-Funktion empfangen wurde
today = datetime.datetime.today()
#index_Schreiben Sie die Informationen aus dem Ergebnis in die Datenbank
row = Data(name=name,article=article,timestamp=today)
db_session.add(row)
db_session.commit()
#index_result.Kehren Sie zu HTML zurück
return render_template('index_result.html',article=article,name=name)
if __name__ == '__main__':
app.run(debug=False)
Als Referenz ist das Löschen aus der gelesenen Datenbank wie folgt. Geben Sie das Element an, das Sie aus db_session.query (Data) .all (das erste Element im folgenden Fall) löschen möchten, und verwenden Sie de_session.delete
#coding: utf-8
from assets.database import db_session
from assets.models import Data
def csv_sakujo():
data = db_session.query(Data).all()
datum = data[0]
db_session.delete(datum)
db_session.commit()
csv_sakujo()
Als Referenz lautet die Datei zum Schreiben der gelesenen Datenbank in csv wie folgt.
.p:to_csv.py
#coding: utf-8
from assets.database import db_session
from assets.models import Data
#Daten lesen
def csv_kakikomi():
data = db_session.query(Data.name,Data.article,Data.timestamp).all()
print(data)
#Schreiben Sie im Schreibmodus in eine CSV-Datei#
with open('articles2.csv','w',encoding='utf-8') as f:
for i in data:
f.write(str(i[0])+',')
f.write(str(i[1])+',')
f.write(str(i[2])+',' + '\n')
csv_kakikomi()
Zeigen Sie den Wert der von app.py gesendeten Daten an. Von den Datenwerten ist data [2] das aktuelle Datum und die aktuelle Uhrzeit. Da jedoch vor dem Posten ein Wert für None vorhanden ist, wird dieser Wert so festgelegt, dass in der if-Anweisung kein Fehler auftritt. Nach dem Posten wird der Datenzeittyp mit strftime in den str-Typ konvertiert und dann angezeigt.
.html:index.html
{% extends 'layout.html' %}
{% block content %}
<h1>Nyanko Bulletin Board</h1>
<form action='/result' method='post'>
<label for='name'>Nyankos Name</label>
<input type='text' name='name'>
<p></p>
<label for='article'>Post</label>
<input type='text' name='article'>
<button type='subimit'>Schreiben</button>
</form>
<p></p>
<p></p>
<table border=1>
<tr>
<th>Nyankos Name</th>
<th>Geposteter Inhalt</th>
<th>Datum und Uhrzeit veröffentlichen</th>
</tr>
{% for datum in data %}
<tr>
<td>{{datum[0]}}</td>
<td>{{datum[1]}}</td>
{% if datum[2] == None %}
<td>{{datum[2]}}</td>
{% else %}
<td>{{datum[2].strftime('%Y Jahr%m Monat%d Tag/%Uhr%M Minuten%S Sekunden')}}</td>
{% endif %}
</tr>
{% endfor %}
</table>
{% endblock %}
Versuchen Sie bisher einmal, festzustellen, ob es in der lokalen Umgebung normal funktioniert. Nachdem Sie bestätigt haben, dass es einwandfrei funktioniert, stellen Sie es auf Heoku bereit und verwenden Sie Herokus PostgreSQL.
Stellen Sie es in Heroku bereit und verwenden Sie PostgreSQL.
Installieren Sie postgresql mit Brew.
brew install postgresql
Installieren Sie als Nächstes psycopg2-binary als Treiber für Python, um postgresql zu verwenden. Wenn Sie psycopg2 so installieren, wie es ist, tritt aus irgendeinem Grund ein Fehler auf. Installieren Sie daher psycopg2-binary (Ursache unbekannt).
pip install psycopg2-binary
Ändern Sie als Nächstes database.py, beschreiben Sie jedoch den Vorgang, bei dem die Umgebungsvariable in Heroku mit dem Namen environ angezeigt und die Datenbank mit dem Namen DATABASE_URL abgerufen wird. Die URL des Verbindungsziels wird in der Umgebung festgelegt. Durch Hinzufügen von oder wird SQLite in der lokalen Umgebung als Datenbank bezeichnet. Wenn Sie mit Heroku verbunden sind, lesen Sie die Postgresql-URL. Wenn Sie nicht verbunden sind, gehen Sie zu SQL. Insbesondere ist es wie folgt.
engine = create_engine(os.environ.get('DATABASE_URL') or 'sqlite:///' + database_file,convert_unicode=True,echo=True)
Die gesamte modifizierte app.py lautet wie folgt
.py:database.py
#coding: utf-8
#database.py/Datei, die die anfänglichen Einstellungen der zu verwendenden Datenbank verarbeitet, z. B. SQLite
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session,sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import datetime
import os
database_file = os.path.join(os.path.abspath(os.path.dirname(__file__)),'data.db')
engine = create_engine(os.environ.get('DATABASE_URL') or 'sqlite:///' + database_file,convert_unicode=True,echo=True)
db_session = scoped_session(
sessionmaker(
autocommit = False,
autoflush = False,
bind = engine
)
)
#declarative_Erstellen Sie eine Instanz von base
Base = declarative_base()
Base.query = db_session.query_property()
#Initialisieren Sie die Datenbank
def init_db():
#Importieren Sie Modelle in den Assets-Ordner
import assets.models
Base.metadata.create_all(bind=engine)
In Heroku bereitstellen.
heroku login
Heroku mit der lokalen Umgebung verbinden,
heroku git:remote -a cat-bbs
Erstellen Sie die Anforderung.txt erneut in der Verzeichnis-App. (Da psycopg2-binary installiert wurde, muss es erneut erstellt werden.)
pip freeze > requirements.txt
Da das Prockfile bereits erstellt wurde, werde ich es diesmal nicht berühren.
Alles hinzufügen,
git add .
Dieses Mal mit dem Namen the-second festschreiben,
git commit -m'the-second'
Schieben Sie zu Heroku.
git push heroku master
~~ Endlich Heroku offen ~~
Initialisieren Sie die Datenbank, bevor Sie sie in Heroku bereitstellen. Starten Sie Python auf Heroku (Python-Modus).
heroku run python
Initialisieren Sie die Datenbank. Schreiben Sie Folgendes im Python-Modus.
from assets.database import init_db
init_db()
Beenden Sie den Python-Modus, starten Sie Heroku neu und öffnen Sie es.
heroku restart
heroku open
Überprüfen Sie Folgendes im Browser und erfolgreich.
Versuchen Sie beispielsweise, das oberste Element in der Datenbank zu löschen ("schwarz"). Starten Sie Herokus Python-Modus.
heroku run python
Schreiben Sie Folgendes im Python-Modus
from assets.database import db_session
from assets.models import Data
data = db_session.query(Data).all()
datum = data[0]
db_session.delete(datum)
db_session.commit()
Wenn Sie Heroku öffnen und mit einem Browser überprüfen, Das obere "Schwarz" wurde entfernt. (Vergessen Sie nicht, den Python-Modus zu verlassen.)
Nach der Installation von PostgreSQL können Sie Heroku Postgres mit dem Befehl heroku pg bedienen. Wenn Sie beispielsweise Folgendes eingeben, können Sie den Status des installierten Heroku Postgres wie folgt überprüfen.
heroku pg:info
=== DATABASE_URL
Plan: Hobby-dev
Status: Available
Connections: 2/20
PG Version: 12.2
Created: 2020-03-14 04:53 UTC
Data Size: 8.2 MB
Tables: 1
Rows: 3/10000 (In compliance)
Fork/Follow: Unsupported
Rollback: Unsupported
Continuous Protection: Off
hobby-Entwicklungsplan(Kostenlose Stufe)Und Status ist verfügbar(Wirksamkeit) 。
Sie können eine Verbindung zu Heroku Postgres herstellen, indem Sie Folgendes eingeben:
heroku pg:psql
Verwenden Sie nach dem Herstellen der Verbindung PostgreSQL-Befehle Versuchen Sie beispielsweise, das oberste Element zu löschen ("test", "poop").
Befehl zur Anzeige der Tabellenliste
\dt;
Befehl zum Auflisten der Daten in der Tabelle
select *aus Daten (Tabellenname);
Folgendes wird ausgegeben.
cat-bbs::DATABASE=> select * from data;
id | name | article | timestamp
----+------------+--------------------+----------------------------
3 |Prüfung|Poop| 2020-03-14 05:59:38.062361
4 |Pooh|Keiner| 2020-03-14 15:14:12.453124
5 |Machaaki|Was ist damit| 2020-03-14 15:14:12.453124
6 |Doburok|Damit| 2020-03-14 15:14:12.635542
7 |seltsam|Keiner| 2020-03-14 15:14:12.635542
8 |Oh|Korrekt| 2020-03-14 15:14:12.453124
9 |Neu|Mond| 2020-03-14 15:32:49.082485
10 |Mädchen|Hoch| 2020-03-14 15:59:30.175208
11 |Ja wirklich|Beratung| 2020-03-14 15:59:47.029891
12 |e?|Fondo| 2020-03-14 16:15:58.35794
13 |Naoki|Prüfung| 2020-03-14 16:24:47.435301
14 |Pochi|Auch wenn es eine Katze ist, ist es eine Katze.| 2020-03-14 22:52:41.633207
(12 rows)
Löschen Sie als Nächstes das oberste Element mit "Löschen" ("Test", "Kacken").
aus Daten löschen (Tabellenname) wobei id=3;
Dann
cat-bbs::DATABASE=> select * From data;
id | name | article | timestamp
----+------------+--------------------+----------------------------
4 |Pooh|Keiner| 2020-03-14 15:14:12.453124
5 |Machaaki|Was ist damit| 2020-03-14 15:14:12.453124
6 |Doburok|Damit| 2020-03-14 15:14:12.635542
7 |seltsam|Keiner| 2020-03-14 15:14:12.635542
8 |Oh|Korrekt| 2020-03-14 15:14:12.453124
9 |Neu|Mond| 2020-03-14 15:32:49.082485
10 |Mädchen|Hoch| 2020-03-14 15:59:30.175208
11 |Ja wirklich|Beratung| 2020-03-14 15:59:47.029891
12 |e?|Fondo| 2020-03-14 16:15:58.35794
13 |Naoki|Prüfung| 2020-03-14 16:24:47.435301
14 |Pochi|Auch wenn es eine Katze ist, ist es eine Katze.| 2020-03-14 22:52:41.633207
(11 rows)
Gelöscht. Selbst wenn ich es mit einem Browser überprüfe, wird es ordnungsgemäß gelöscht.
Recommended Posts