Es wird der erste Beitrag sein. Ich bin ein PHP-Ingenieur mit anderthalb Jahren Programmiererfahrung.
Ich verwende AWS für meine tägliche Arbeit, war aber noch nicht in die Produktionsumgebung involviert. Daher möchte ich zusammenfassen, was ich durch diese Bereitstellung für Heroku aus der Sicht eines Anfängers gelernt habe.
Ich werde kurz die App vorstellen, die ich dieses Mal gemacht habe.
--Erstellen Sie einen Verwaltungsbildschirm zum Hinzufügen / Bearbeiten von Text für die automatische Antwort mit der Flasche
--Bot wird mit Pythons "Twitter" -Bibliothek implementiert
app/
├── web.py #Ausführungsdatei der Kolben-App
├── web/ #Kolben App
│ ├── models/
│ ├── static/
│ ├── templates/
│ ├── views/
│ ├── __init__.py
│ ├── config.py
│ └── database.py
├── twitter.py #Ausführungsdatei der automatischen Antwort Bot
├── twitter/ #Automatische Antwort Bot (teilweise weggelassen)
│ ├── __init__.py
│ ├── config.py
│ └── database.py
├── Procfile
├── requirements.txt
├── runtime.txt
├── .env
├── .gitignore
├── migrations/ # Flask-Erstellt mit Migrieren
└── venv/ #Lokale virtuelle Umgebung
In Bezug auf den Kolben habe ich auf den folgenden Artikel verwiesen.
Die Geschichte, Blueprints auszuprobieren, wenn man über die Verzeichnisstruktur von Flask nachdenkt
Es scheint, dass Sie eine Datei vorbereiten müssen, um Heroku die Umgebung, die erforderlichen Bibliotheken und ausführbaren Dateien mitzuteilen.
requirements.txt
Listen Sie die erforderlichen Bibliotheken einschließlich der Version auf. Da ich mit venv entwickelt habe, gebe ich das in der virtuellen Umgebung installierte Paket mit dem folgenden Befehl in eine Datei aus.
(venv)$ pip freeze > requirements.txt
Liste der installierten Bibliotheken
requirements.txt
alembic==1.4.2
autopep8==1.5.3
cffi==1.14.0
click==7.1.2
cryptography==2.9.2
Flask==1.1.2
Flask-Login==0.5.0
Flask-Migrate==2.5.3
Flask-SQLAlchemy==2.4.3
gunicorn==20.0.4
itsdangerous==1.1.0
Jinja2==2.11.2
Mako==1.1.3
MarkupSafe==1.1.1
pycodestyle==2.6.0
pycparser==2.20
PyMySQL==0.9.3
python-dateutil==2.8.1
python-dotenv==0.14.0
python-editor==1.0.4
six==1.15.0
SQLAlchemy==1.3.18
toml==0.10.1
twitter==1.18.0
Werkzeug==1.0.1
runtime.txt
Es scheint, dass dies nicht separat sein muss, aber ich werde es vorbereiten, um die Version von Python anzugeben. Achten Sie auch darauf, die von Heroku unterstützte Version anzugeben (https://devcenter.heroku.com/articles/python-support).
runtime.txt
python-3.7.8
Procfile
Geben Sie an, wie die App gestartet werden soll. Die Kolben-App muss einen WSGI-Server wie "Gunicorn" in einer Produktionsumgebung verwenden.
Procfile
web: gunicorn web:app --log-file=-
worker: python twitter.py
web
startet eine Flask-Instanz namens app in web.py.
In worker
wird die Ausführungsdatei twitter.py des automatischen Antwortbots ausgeführt.
Ich bin darauf gestoßen, wie verschiedene Umgebungsvariablen (z. B. DB-Informationen) zwischen der lokalen Umgebung und der Produktionsumgebung festgelegt werden können, ohne den Code neu zu schreiben. Daher werde ich sie zusammenfassen.
Sie können Umgebungsvariablen mit dem folgenden Befehl festlegen. (Sie müssen Heroku CLI (https://devcenter.heroku.com/articles/heroku-cli) installieren, um den Befehl verwenden zu können.)
$ heroku config:set DB_HOST=xxxxxxxxxxx
Sie können die Liste der Umgebungsvariablen anzeigen und prüfen, ob sie festgelegt wurden.
$ heroku config
Informationen zum Festlegen von Umgebungsvariablen in MySQL DB finden Sie hier. ・ Verwendung von MySQL mit Heroku
Bereiten Sie eine .env-Datei vor und beschreiben Sie dort die Umgebungsvariablen. Es handelt sich um vertrauliche Informationen. Vergessen Sie also nicht, sie zu speichern.
.env
ENV = 'LOCAL'
# DB
DB_HOST = 'xxxxx'
DB_NAME = 'xxxxx'
DB_USER = 'xxxxx'
DB_PASSWORD = 'xxxxx'
# Session
SESSION_SECRET_KEY = 'xxxxx'
Lesen Sie die Umgebungsvariablen in app / web / config.py wie unten gezeigt und konfigurieren Sie die Einstellungen auf der App-Seite.
config.py
"""Kolbenkonfiguration bereitstellen"""
import os
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '../.env')
load_dotenv(dotenv_path)
class Config:
# Flask
if (os.environ.get('ENV') == 'LOCAL'):
DEBUG = True
else:
DEBUG = False
# Session
SECRET_KEY = os.environ.get('SESSION_SECRET_KEY')
# SQLAlchemy
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{user}:{password}@{host}/{db_name}?charset=utf8'.format(**{
'user': os.environ.get('DB_USER'),
'password': os.environ.get('DB_PASSWORD'),
'host': os.environ.get('DB_HOST'),
'db_name': os.environ.get('DB_NAME')
})
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = False
Config = Config
Mit dieser Einstellung können Umgebungsvariablen sowohl in der Heroku-Umgebung als auch in der lokalen Umgebung gelesen werden. Für den Umgang mit Umgebungsvariablen in Python habe ich hier verwiesen. ・ So schreiben Sie Umgebungsvariablen, die Sie nicht in [GitHub] Python einfügen möchten
Da es für die Twitter-API nicht gut ist, in kurzer Zeit viele Male automatisch zu antworten, haben wir festgelegt, dass eine Antwort pro Konto und Tag erfolgt.
Ich habe mich gefragt, wie ich die Benutzer verwalten soll, die einmal geantwortet haben.
Außerdem wird Dynas mindestens einmal täglich neu gestartet (in Umlauf gebracht), um den Zustand der auf Heroku ausgeführten Anwendung zu gewährleisten. Alle Änderungen am lokalen Dateisystem werden entfernt. Das Radfahren erfolgt alle 24 Stunden (plus bis zu 216 zufällige Minuten, um zu verhindern, dass alle Dynos in der Anwendung gleichzeitig neu gestartet werden).
Automatischer Neustart von Heroku scheint alle 24 Stunden durchgeführt zu werden, diesmal also in der als Worker angegebenen Python-Datei (immer Schleife) Ich habe beschlossen, die beantworteten Benutzer in der Liste von) zu verwalten. Auf diese Weise wird die Liste jedes Mal initialisiert, wenn sie automatisch neu gestartet wird, und Sie können alle 24 Stunden automatisch erneut antworten.
twitter.py
replied_user_list = [] #Verwalten Sie antwortende Benutzer in einer Liste
#24 Stunden lang überwachen (Programm läuft weiter)
for tweet in twitter_stream.statuses.filter(language='ja', track=tracking_text):
#Unten ein bestimmtes Wort (Tracking)_Verarbeitung, wenn ein Tweet mit Text erkannt wird
# ...
#Die automatische Antwort wird zur Liste hinzugefügt
replied_user_list.append(user_id)
# ...
Herokus Free Dyno-Plan wird automatisch deaktiviert, wenn Sie 30 Minuten lang nicht auf die Web-App zugreifen. Es gibt kein Problem damit, aber es scheint, dass, wenn "Web" schläft, "Arbeiter" auch schläft. [https://devcenter.heroku.com/articles/free-dyno-hours#dyno-sleeping]
Apps that only utilise a free worker dyno do not sleep, because they do not respond to web requests. Be mindful of this as they may run 24/7 and consume from your pool of hours.
Dies ist ein ziemliches Problem, da der automatische Antwort-Bot nicht mehr reagiert, wenn der "Arbeiter" in den Schlaf geht.
Daher scheint es eine Problemumgehung zu geben, z. B. das regelmäßige Senden einer Anfrage wie folgt, um zu verhindern, dass "Web" in den Ruhezustand wechselt. ・ Vier Möglichkeiten, um Herokus kostenlosen Prüfstand 24 Stunden am Tag laufen zu lassen
In diesem Fall arbeiten sowohl der "Web" - als auch der "Worker" -Dyno 24 Stunden am Tag weiter und überschreiten die freie Dyno-Zeit von 1000 Stunden / Monat.
Aus diesem Grund habe ich beschlossen, "Web" zu stoppen, außer wenn dies erforderlich ist. (Einfach auf dem Heroku-Dashboard zu starten) Da "Arbeiter" alleine nicht schläft, kann der automatische Antwort-Bot jetzt 24 Stunden am Tag in Betrieb sein.
Es war mein erstes Mal, dass ich eine Webanwendung mit Python entwickelte, und ich dachte, ich würde darüber schreiben, aber dieses Mal schrieb ich hauptsächlich über das, worauf ich bei der Bereitstellung in Heroku gestoßen bin.
Mir wurde klar, dass ich mehr Wissen als das Codieren erwerben musste. In Zukunft möchte ich AWS studieren und Associate von AWS Solution Architect werden.
Da dies mein erster technischer Blog ist, würde ich mich über Ihren Rat zu nichttechnischen Fragen wie der Lesbarkeit freuen. Natürlich würde ich mich über Ihre technischen Vorschläge freuen.
Recommended Posts