[PYTHON] [Erste persönliche Entwicklung] Die Geschichte der Bereitstellung der Flask-App und des automatischen Antwort-Bot von Twitter auf Heroku

Einführung

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

Verzeichnisaufbau

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.

Dateien, die für die Bereitstellung in Heroku erforderlich sind

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.

Umgebungsvariablen einstellen

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.

Heroku-Umgebungsvariablen

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

Lokale Umgebungsvariablen

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 Umgebungsvariablen auf der App-Seite

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

So implementieren Sie 1 Antwort pro Tag und Konto

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)
    # ...

Problem, dass der Arbeiter schläft, wenn das Web schläft

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.

Zusammenfassung

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

[Erste persönliche Entwicklung] Die Geschichte der Bereitstellung der Flask-App und des automatischen Antwort-Bot von Twitter auf Heroku
Stellen Sie die Flask-App auf Heroku bereit
Stellen Sie die Flask-App auf Heroku bereit
Verschiedene Hinweise zur Bereitstellung der Django-App auf Heroku
Ein Memorandum, in dem ich über mein persönliches HEROKU & Python (Flask) gestolpert bin
Die Geschichte, ein Tool zu erstellen, das auf Mac und Windows auf der Spieleentwicklungsseite ausgeführt wird
Die Geschichte von Python und die Geschichte von NaN
Führen Sie die App mit Flask + Heroku aus
Stellen Sie die Flask-App für Heroku bereit (bitter)
Heroku-Bereitstellung der ersten Django-App, von der Anfänger abhängig sind
Die Geschichte des Ausführens der asp.net Core 3.1-App auf der arm64-Version von Amazon Linux 2
Stellen Sie die Django-App in Heroku bereit [Teil 2]
Stellen Sie die Django-App in Heroku bereit [Teil 1]
Die Geschichte, deep3d auszuprobieren und zu verlieren
Ändern Sie die Reihenfolge von PostgreSQL in Heroku
Erste Schritte mit Heroku, Bereitstellen der Flaschen-App