Cette fois, la création du babillard est décrite en le classant dans les six catégories suivantes. (1) Construction de l'environnement (2) Tableau d'affichage avec csv (3) Tableau d'affichage avec SQL et SQL Alchemy (4) Tableau d'affichage avec PostgreSQL et SQL Alchemy (5) Manipulation des données à l'aide de SQLAlchemy (6) Manipulation des données à l'aide de Postgresql
Créez un test d'annuaire sur votre bureau. Créez un environnement virtuel en test et démarrez-le.
python3 -m venv .
source bin/activate
Installez le framework et le serveur Web requis.
pip install flask
pip install gunicorn
Commencez par créer un tableau d'affichage à l'aide de csv dans l'environnement local.
test
├app.py
├articles.csv
├Procfile
├requirements.txt
└templates
├index.html
├layout.html
└index_result.html
Créez articles.csv et entrez les données suivantes à l'avance du point de vue de la compréhensibilité.
Marbre,Somnolent
blanc,j'ai faim
Noir,Quelque peu chaud
Marbre,Poe Poe Poe
Pontan,Pas de papier toilette
Naochin,Chaîne
.py:app.py
#coding: utf-8
from flask import Flask,request,render_template
app = Flask(__name__)
@app.route('/')
def bbs():
lines = []
#avec open pour lire le fichier csv
with open('articles.csv',encoding='utf-8') as f:
lines = f.readlines() #readlines renvoie le contenu de csv au format liste
#index.Revenir au html
return render_template('index.html',lines=lines)
#Recevoir la méthode de publication
@app.route('/result',methods=['POST'])
def result():
#Obtenir la valeur de l'article et du nom dans la demande
article = request.form['article']
name = request.form['name']
#Ecrire dans un fichier csv en mode écrasement
with open('articles.csv','a',encoding='utf-8') as f:
f.write(name + ',' + article + '\n')
#index_result.Revenir au html
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>Tableau d'affichage Nyanko</h1>
<form action='/result' method='post'>
<label for='name'>Le nom de Nyanko</label>
<input type='text' name='name'>
<p></p>
<label for='article'>Publier</label>
<input type='text' name='article'>
<button type='subimit'>Écrire</button>
</form>
<p></p>
<p></p>
<table border=1>
<tr><th>Le nom de Nyanko</th><th>Contenu publié</th></tr>
{% for line in lines: %}
<!--Définissez une variable appelée colonne (un ensemble est requis pour l'ensemble de variables jinja2)-->
<!--Utilisation de split,Classer par. split renvoie une liste-->
{% 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-J'ai écrit sur le babillard</h1>
<p>{{name}}{{article}}</p>
<!--informer/Retour à-->
<form action='/' method='get'>
<button type='submit'>Revenir</button>
</form>
{% endblock %}
Après avoir testé dans l'environnement local, déployez sur Heroku. Les détails du déploiement sur Heroku sont tels que décrits dans l'article suivant, donc je n'utiliserai que l'essence et omettrai l'explication détaillée. Comment télécharger avec Heroku, Flask, Python, Git (Partie 2) Comment télécharger avec Heroku, Flask, Python, Git (3) Connectez-vous à Heroku et créez une application sur Heroku
heroku login
Le nom de l'application est cat-bbs.
Heroku create cat-bbs
Initialisez l'application d'annuaire,
git init
Relier Heroku à l'environnement local,
heroku git:remote -a cat-bbs
Créez requirements.txt dans l'application d'annuaire
pip freeze > requirements.txt
Créez un fichier Procfile dans l'application d'annuaire et entrez ce qui suit. À ce stade, un espace est requis avant g, et l'application avant: app signifie app dans app.py, alors soyez prudent (formulaire: app pour form.py).
web: gunicorn app:app --log-file -
Tout ajouter,
git add .
Cette fois, engagez-vous avec le nom du premier,
git commit -m'the-first'
Poussez vers Heroku.
git push heroku master
Finalement,
heroku open
Lorsque j'ai entré la commande heroku open, le navigateur a démarré et ce qui suit a été affiché. Si vous publiez le nom de Nyanko comme "Iwashi" et le contenu du message comme "J'aime le poisson", Il était correctement affiché sur le babillard. Dans heroku, le csv écrit disparaît après un certain laps de temps (30 minutes), nous allons donc commencer à intégrer la base de données.
test
├app.py
├articles.csv
├Procfile
├requirements.txt
├assets
│ ├init.py
│ ├database.py
│ └models.py
│
└templates
├index.html
├layout.html
└index_result.html
SQLAlchemy est l'un des ORM les plus populaires de Python. Tout d'abord, vérifiez la version de sqlite3 (Mac) et installez sqlalchemy.
sqlite3 --version
pip install sqlalchemy
De plus, à partir de app.py, créez init.py dans le dossier assets en tant que fichier requis pour lire database.py et models.py en tant que modules (notez qu'un trait de soulignement est ajouté).
touch __init__.py
Créez les deux fichiers suivants dans le dossier des actifs.
database.py ・ ・ ・ Fichier qui définit la base de données à utiliser, telle que sqlite et mysql models.py ・ ・ ・ Un fichier qui définit le type d'informations mises dans la base de données Tout d'abord, database.py est le suivant.
.py:database.py
#coding: utf-8
#database.py/Fichier qui gère les paramètres initiaux de la base de données à utiliser, telle que 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_Base de données nommée, base de données.Où py est (os.path.dirname(__file__)), Avec un chemin absolu (os.path.abspath)、data_Enregistrer la base de données
database_file = os.path.join(os.path.abspath(os.path.dirname(__file__)),'data.db')
#Utilisation de la base de données sqlite (engin)、database_données stockées dans un fichier_Utilisez db et émettez sqlite lors de l'exécution avec echo (echo=True)
engine = create_engine('sqlite:///' + database_file,convert_unicode=True,echo=True)
db_session = scoped_session(
sessionmaker(
autocommit = False,
autoflush = False,
bind = engine
)
)
#declarative_Créer une instance de base
Base = declarative_base()
Base.query = db_session.query_property()
#Fonction d'initialisation de la base de données
def init_db():
#Importer des modèles dans le dossier des actifs
import assets.models
Base.metadata.create_all(bind=engine)
Ensuite, models.py est le suivant. Ici, la date et l'heure d'affichage sont également reflétées sur le tableau d'affichage.
.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
#Informations sur la table de base de données
class Data(Base):
#Paramètres de nom de table,Définir pour nommer les données
__tablename__ = "data"
#Définir les informations de colonne, définir unique sur False (ce qui signifie que la même valeur est acceptée)
#La clé primaire est requise lors de la recherche d'une ligne, généralement définie
id = Column(Integer,primary_key=True)
#le nom est l'affiche
name = Column(Text,unique=False)
#l'article est le contenu publié
article = Column(Text,unique=False)
#horodatage est la date et l'heure de publication
timestamp = Column(DateTime,unique=False)
#initialiser
def __init__(self,name=None,article=None,timestamp=None):
self.name = name
self.article = article
self.timestamp = timestamp
Les deux suivants sont nécessaires pour créer ou supprimer la base de données, alors importez-les. Importez la variable de_session du module de base de données dans le dossier assets et la classe Data du module models dans le dossier assets.
from assets.database import db_session
from assets.models import Data
Il est nécessaire d'obtenir les valeurs d'article et de nom à partir de index.html. De plus, il est nécessaire d'acquérir la date et l'heure (au moment de la rédaction) au moment de l'acquisition de chaque valeur avec today () et de l'affecter à la variable today. Plus précisément, c'est comme suit.
article = request.form['article']
name = request.form['name']
today = datetime.datetime.today()
Il est nécessaire de stocker les contenus ci-dessus en ligne et de les écrire dans la base de données avec db_session et de_commit. Plus précisément, c'est comme suit.
row = Data(name=name,article=article,timestamp=today)
db_session.add(row)
db_session.commit()
Pour lire les données de la base de données, vous pouvez les obtenir avec db_session.query (Data) .all (). Par exemple, si vous écrivez ce qui suit pour récupérer la valeur dans la base de données,
db_session.query(Data.name,Data.article,Data.timestamp).all()
Sortie sous forme de liste comme indiqué ci-dessous * (Pour faciliter la compréhension, il est supposé que plusieurs messages sont affichés sur le tableau d'affichage et enregistrés dans la base de données) *
('Mike', 'C'est ensoleillé aujourd'hui', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
('blanc', 'Il pleut demain', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
('Noir', 'Chaud', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
('Pontan', 'Nya Nya Crow est un avion en papier', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
('blanc', 'Mon dos me fait mal', datetime.datetime(2020, 3, 13, 0, 7, 46, 513144)),
('Mike', 'Qu'Est-ce que c'est?', datetime.datetime(2020, 3, 13, 0, 8, 57, 193710)),
('Noir', 'Chaud', datetime.datetime(2020, 3, 13, 0, 9, 42, 45228)),
('Mike', 'Nuageux aujourd'hui', datetime.datetime(2020, 3, 13, 0, 17, 13, 709028)),
('Boo Taro', 'Il pleut toute la journée aujourd'hui', datetime.datetime(2020, 3, 14, 13, 26, 29, 438012)),
Il est nécessaire de traiter pour renvoyer le contenu de la base de données lu dans index.html. Plus précisément, c'est comme suit.
data = db_session.query(Data.name,Data.article,Data.timestamp).all()
return render_template('index.html',data=data)
Ce qui suit est un résumé des modifications apportées jusqu'à présent pour app.py dans son ensemble.
.py:app.py
#coding: utf-8
from flask import Flask,request,render_template
import datetime
#Ajouté lors de l'utilisation de la base de données
from assets.database import db_session
from assets.models import Data
app = Flask(__name__)
@app.route('/')
def bbs():
#Lire à partir de la base de données
data = db_session.query(Data.name,Data.article,Data.timestamp).all()
#index.Revenir au html
return render_template('index.html',data=data)
#Recevoir la méthode de publication
@app.route('/result',methods=['POST'])
def result():
#Obtenir la valeur de l'article et du nom dans la demande
article = request.form['article']
name = request.form['name']
#Attribuez la date et l'heure de réception de la méthode de publication par la fonction today à la variable
today = datetime.datetime.today()
#index_Écrire les informations du résultat dans la base de données
row = Data(name=name,article=article,timestamp=today)
db_session.add(row)
db_session.commit()
#index_result.Revenir au html
return render_template('index_result.html',article=article,name=name)
if __name__ == '__main__':
app.run(debug=False)
Pour référence, la suppression de la base de données lue est la suivante. Spécifiez l'élément que vous souhaitez supprimer de db_session.query (Data) .all (le premier élément dans le cas suivant) et utilisez 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()
Pour référence, le fichier pour écrire la base de données lue dans csv est le suivant.
.p:to_csv.py
#coding: utf-8
from assets.database import db_session
from assets.models import Data
#Lire les données
def csv_kakikomi():
data = db_session.query(Data.name,Data.article,Data.timestamp).all()
print(data)
#Écrire dans un fichier csv en mode écriture#
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()
Affichez la valeur des données envoyées depuis app.py. Parmi les valeurs de données, data [2] est la date et l'heure actuelles, mais comme il existe une valeur None avant la publication, elle est définie de sorte qu'une erreur ne se produise pas dans l'instruction if. Après la publication, le type datatime est converti en type str à l'aide de strftime, puis affiché.
.html:index.html
{% extends 'layout.html' %}
{% block content %}
<h1>Tableau d'affichage Nyanko</h1>
<form action='/result' method='post'>
<label for='name'>Le nom de Nyanko</label>
<input type='text' name='name'>
<p></p>
<label for='article'>Publier</label>
<input type='text' name='article'>
<button type='subimit'>Écrire</button>
</form>
<p></p>
<p></p>
<table border=1>
<tr>
<th>Le nom de Nyanko</th>
<th>Contenu publié</th>
<th>Date et heure de publication</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 année%m mois%jour j/%H heure%M minutes%S secondes')}}</td>
{% endif %}
</tr>
{% endfor %}
</table>
{% endblock %}
Jusqu'à présent, essayez une fois de voir si cela fonctionne normalement dans l'environnement local. Après avoir confirmé que cela fonctionne correctement, déployez sur Heoku et utilisez PostgreSQL de Heroku.
Déployez sur Heroku et utilisez PostgreSQL.
Installez postgresql en utilisant brew.
brew install postgresql
Ensuite, installez psycopg2-binary comme pilote pour python pour utiliser postgresql. Si vous installez psycopg2 tel quel, une erreur se produira pour une raison quelconque, alors installez psycopg2-binary (cause inconnue).
pip install psycopg2-binary
Ensuite, modifiez database.py, mais décrivez le processus pour accéder à la variable d'environnement sur Heroku appelée environ et obtenir la base de données appelée DATABASE_URL. L'URL de la destination de la connexion est définie dans environ. De plus, en ajoutant ou, sqlite est appelé base de données dans l'environnement local. Si vous êtes connecté à heroku, reportez-vous à l'url postgresql, et si vous n'êtes pas connecté, accédez à sql. Plus précisément, c'est comme suit.
engine = create_engine(os.environ.get('DATABASE_URL') or 'sqlite:///' + database_file,convert_unicode=True,echo=True)
L'ensemble du fichier app.py modifié est le suivant
.py:database.py
#coding: utf-8
#database.py/Fichier qui gère les paramètres initiaux de la base de données à utiliser, telle que 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_Créer une instance de base
Base = declarative_base()
Base.query = db_session.query_property()
#Initialiser la base de données
def init_db():
#Importer des modèles dans le dossier des actifs
import assets.models
Base.metadata.create_all(bind=engine)
Déployez-vous sur Heroku.
heroku login
Relier Heroku à l'environnement local,
heroku git:remote -a cat-bbs
Créez à nouveau requirements.txt dans l'application d'annuaire. (Puisque psycopg2-binary a été installé, il doit être recréé.)
pip freeze > requirements.txt
Puisque le Prockfile a déjà été créé, je n'y toucherai pas cette fois.
Tout ajouter,
git add .
Cette fois, engagez-vous avec le nom de la seconde,
git commit -m'the-second'
Poussez vers Heroku.
git push heroku master
~~ Enfin heroku ouvert ~~
Initialisez la base de données avant de la déployer sur heroku. Démarrez python sur heroku (mode python).
heroku run python
Initialisez la base de données. Écrivez ce qui suit en mode python.
from assets.database import init_db
init_db()
Quittez le mode python, redémarrez heroku et ouvrez-le.
heroku restart
heroku open
Vérifiez les éléments suivants dans le navigateur et réussissez.
À titre d'exemple, essayez de supprimer l'élément supérieur de la base de données («noir»). Démarrez le mode python de Heroku.
heroku run python
Écrivez ce qui suit en mode python
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()
Comme, lorsque vous ouvrez heroku et le vérifiez avec un navigateur, Le haut "noir" a été supprimé. (N'oubliez pas de quitter le mode python)
Après avoir installé PostgreSQL, vous pouvez utiliser Heroku Postgres avec la commande heroku pg. Par exemple, si vous entrez ce qui suit, vous pouvez vérifier l'état de Heroku Postgres installé comme suit.
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-plan de développement(Niveau gratuit)Et le statut est disponible(Efficacité) 。
Vous pouvez vous connecter à Heroku Postgres en tapant:
heroku pg:psql
Utiliser les commandes PostgreSQL après la connexion Par exemple, essayez de supprimer l'élément supérieur ("test", "merde").
Commande d'affichage de la liste des tableaux
\dt;
Commande pour lister les données dans le tableau
select *à partir des données (nom de la table);
Ce qui suit est sorti.
cat-bbs::DATABASE=> select * from data;
id | name | article | timestamp
----+------------+--------------------+----------------------------
3 |tester|Caca| 2020-03-14 05:59:38.062361
4 |Caca|Aucun| 2020-03-14 15:14:12.453124
5 |Machaaki|Qu'en est-il| 2020-03-14 15:14:12.453124
6 |Doburok|Alors| 2020-03-14 15:14:12.635542
7 |étrange|Aucun| 2020-03-14 15:14:12.635542
8 |Oh|C'est vrai| 2020-03-14 15:14:12.453124
9 |Nouveau|Lune| 2020-03-14 15:32:49.082485
10 |Les filles|Haute| 2020-03-14 15:59:30.175208
11 |Vraiment|Consultation| 2020-03-14 15:59:47.029891
12 |e?|Fondo| 2020-03-14 16:15:58.35794
13 |Naoki|tester| 2020-03-14 16:24:47.435301
14 |Pochi|Même si c ’est un chat, c’ est un chat.| 2020-03-14 22:52:41.633207
(12 rows)
Ensuite, supprimez l'élément supérieur avec delete ("test", "merde").
supprimer des données (nom de la table) où id=3;
Puis
cat-bbs::DATABASE=> select * From data;
id | name | article | timestamp
----+------------+--------------------+----------------------------
4 |Caca|Aucun| 2020-03-14 15:14:12.453124
5 |Machaaki|Qu'en est-il| 2020-03-14 15:14:12.453124
6 |Doburok|Alors| 2020-03-14 15:14:12.635542
7 |étrange|Aucun| 2020-03-14 15:14:12.635542
8 |Oh|C'est vrai| 2020-03-14 15:14:12.453124
9 |Nouveau|Lune| 2020-03-14 15:32:49.082485
10 |Les filles|Haute| 2020-03-14 15:59:30.175208
11 |Vraiment|Consultation| 2020-03-14 15:59:47.029891
12 |e?|Fondo| 2020-03-14 16:15:58.35794
13 |Naoki|tester| 2020-03-14 16:24:47.435301
14 |Pochi|Même si c ’est un chat, c’ est un chat.| 2020-03-14 22:52:41.633207
(11 rows)
Supprimé. Même si je le vérifie avec un navigateur, il est supprimé correctement.
Recommended Posts