[PYTHON] Exécutez l'application avec Flask + Heroku

Je souhaitais déployer une application réalisée avec Flask dans un environnement de production. Ce n'était pas facile et j'ai fini par affronter toute la journée. Quand je le faisais avec Rails, il a démarré instantanément avec git push heroku master de heroku create.

C'est pourquoi je laisserai un mémorandum jusqu'à ce que Flask soit lancé à Heroku.

Environnement de développement

Cliquez ici pour la technologie utilisée pour le déploiement cette fois.

Dans le didacticiel Flask, la base de données est créée avec la commande db.create_all (). Cependant, pour ceux qui sont habitués aux fichiers dits de migration, il est toujours souhaitable de gérer l'état de la table. Dans ce cas, utilisez Flask Migrate.

Version initiale de l'application

Tout d'abord, nous ferons la construction initiale de l'application. Flask est assez personnalisable, donc différents développeurs ont des structures de répertoires différentes. Je suis toujours à la recherche de la meilleure pratique, mais au final ça ressemble à ça.

app/
├── manage.py
├── main
│   ├── __init__.py
│   ├── views.py
│   ├── config.py
│   ├── models.py
│   ├── app.db
│   ├── static/
│   ├── templates/
│   └── instance
│       └──application.cfg
├── Procfile
├── requirements.txt
├── migrations/
└── venv/

Créer un projet

$ cd APP
$ mkdir -p main/{static,templates,instance}
$ cd main
$ touch manage.py requirements.txt Procfile
$ touch main/{__init__,views,models,config}.py

Ajoutez des feuilles de style et visualisez les pièces à votre guise. Cette fois, DB fonctionne correctement dans Heroku, et je le ferai jusqu'à ce que "Hello world!" Soit publié, donc seulement le back-end.

manage.py Un fichier pour démarrer et exécuter flask.

manage.py


from main import app
app.run()

main/init.py Générez l'application flask.

main/__init__.py


from flask import Flask

app = Flask(__name__)

import main.views

main/views.py La partie vue qui affiche Hello world!.

main/views.py


from flask import render_template
from main import app, db

@app.route('/')
def home():
    return render_template('home/index.html')

Créer un fichier de configuration

Il y a de nombreux articles sur les meilleures pratiques ici, donc j'ai pensé qu'il serait plus facile à comprendre si vous y faites référence. Ici, je vais vous présenter ceux qui peuvent cacher les secrets une fois qu'ils se déplacent.

main/config.py

main/config.py


import os

class BaseConfig(object):
    SQLALCHEMY_TRACK_MODIFICATIONS = False  

class DevelopmentConfig(BaseConfig):
    DEBUG = True
    TESTING = True
    SQLALCHEMY_DATABASE_URI = 'sqlite:///app.db'

class ProductionConfig(BaseConfig):
    DEBUG = True
    TESTING = True
    SQLALCHEMY_DATABASE_URI=os.environ.get('DATABASE_URL')

config = {
    "default": "main.config.BaseConfig",
    "development": "main.config.DevelopmentConfig",
    "production": "main.config.ProductionConfig",
}

def configure_app(app):
    config_name= os.getenv('FLASK_ENV')
    app.config.from_object(config[config_name])
    app.config.from_pyfile('application.cfg', silent=True)

** FLASK_ENV ** doit être défini comme ʻexport FLASK_ENV = development`. Ce que je dis ici, c'est que si le contenu de base de BaseConfig est utilisé en commun, le contenu variable est séparé en fonction de l'environnement (développement / production).

ʻOs.environ.get ('DATABASE_URL') `tirera automatiquement ** DATABASE_UEL ** vers la base de données avec Herkou, alors réglez-le pour la production.

main/instance/application.cfg

instance/application.cfg


SECRET_KEY='XXXXXXXXXXXXXXXXXXX'

Ici, la clé API qui ne peut pas être rendue publique est répertoriée. Assurez-vous également de l'écrire en .gitignore et de ne pas le publier.

Lisez le fichier de paramètres

Rendez le fichier de configuration préparé disponible dans __init __. Py.

main/__init__.py


#Ajoutez le contenu suivant
from main.config import configure_app

app = Flask(__name__, instance_relative_config=True)
configure_app(app)

Déployer sur Heroku

Installation de gunicorn et psycpg2

Déployez sur Heroku et installez deux bibliothèques pour utiliser PostgreSQL.

$ pip install gunicorm
$ pip install psycopg2

Ajouté à Procfile

Ajoutez des commandes pour exécuter l'application sur heroku.

web: gunicorn main:app --log-file -

Préparer le package d'installation

pip freeze est une commande pratique qui répertorie toutes les informations de bibliothèque utilisées dans l'environnement virtuel.

$ pip freeze > requirements.txt

Déployer sur l'application Heroku

Le réglage de heroku est omis.

$ heroku create flask-app
$ git push heroku master
$ heroku config:set FLASK_APP=main
$ heroku config:set FLASK_ENV=production

À ce stade, si vous faites $ heroku open, vous devriez voir" Hello world! ".

Paramètres de la base de données

Créer un modèle

Cette fois, nous allons préparer le modèle ʻUser` comme test.

main/models.py


from main import db

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    email = db.Column(db.String, unique=True)

    def __repr__(self):
        return '<User %r>' % self.name

Flask Migrate, installation de SQL Alchemy

Installez chaque bibliothèque requise pour migrer la base de données.

$ pip install flask_migrate
$ pip install flask_sqlalchemy

Modèle de charge

Ajoutez la préparation pour charger le modèle d'ensemble à __init __. Py.

main/__init__.py


#J'ajouterai ce qui suit
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db = SQLAlchemy(app)
migrate = Migrate(app, db)
db.init_app(app)

import main.models

migration

Migrez selon l'ordre de la commande Flask Migrate.

$ flask db init
$ flask db migrate
$ flask db upgrade

Cela générera un fichier migrations et une base de données appelée ʻapp.db`.

Migrer avec Heroku

Préparer le package d'installation

Comme auparavant, configurez la bibliothèque nouvellement installée afin qu'elle puisse être utilisée avec Heroku.

$ pip freeze > requirements.txt

Exécution de la migration

Je suis un peu accro à cela, mais pour Heroku, je donne le fichier migrations généré localement au serveur et n'exécute pas db init ou db migrate.

$ heroku run flask db upgrade

Les références

Recommended Posts

Exécutez l'application avec Flask + Heroku
Touch Flask + courir avec Heroku
Déployez l'application Flask sur Heroku
Déployez l'application Flask sur heroku
Application Web facile avec Python + Flask + Heroku
Premiers pas avec Heroku, déploiement de l'application Flask
Exécutez l'application flask sur Cloud 9 et Apache Httpd
Comment déployer une application Web créée avec Flask sur Heroku
(Échec) Déployer une application Web créée avec Flask avec heroku
Déployer l'application Flask sur heroku (amer)
Ouvrir le fichier avec l'application par défaut
Stockage de table Azure avec l'application PTVS Flask
Déployer l'application flask avec mod_wsgi (à l'aide de pipenv)
Exécutez le YOLO original avec Jetson Nano
[Python] Exécutez Flask sur Google App Engine
Attention Seq2 Exécutez le modèle de dialogue avec Seq
Déployer l'application Django sur Heroku [Partie 2]
Déployer l'application Django sur Heroku [Partie 1]
Créez une application Web simple avec Flask
Lancez l'application Flask avec Docker sur Heroku
Comment télécharger avec Heroku, Flask, Python, Git (4)
Créez une application de composition d'images avec Flask + Pillow
Gagnez l'application Web Python + Flask avec Jenkins
Créer un babillard avec Heroku, Flask, SQL Alchemy
Réalisez facilement des micro-services avec Cloud Run x Flask
Exécutez Flask sur CentOS avec python3.4, Gunicorn + Nginx.
J'ai créé une application Twitter qui décrypte les caractères de pré-connexion avec heroku (échec)
Exécutez Python avec VBA
Exécutez prepDE.py avec python3
Exécutez avec CentOS7 + Apache2.4 + Python3.6 pour le moment
Comment télécharger avec Heroku, Flask, Python, Git (Partie 3)
Apprentissage automatique facile avec scikit-learn et flask ✕ Application Web
Essayez de créer une application Todo avec le framework Django REST
Jusqu'à ce que vous exécutiez l'application Flask sur Google App Engine pour le moment
Exécutez Blender avec python
Comment télécharger avec Heroku, Flask, Python, Git (Partie 1)
Restriction IP avec Flask
Comment télécharger avec Heroku, Flask, Python, Git (Partie 2)
POSTER l'image avec json et la recevoir avec flask
Notes diverses sur le déploiement de l'application django sur Heroku
Mémo de travail que j'ai essayé i18n avec l'application Flask
Bonjour le monde sur flacon
Exécutez Apache2 + WSGI + Flask
Programmation avec Python Flask
Déployer une application Web créée avec Streamlit sur Heroku
Exécutez iperf avec python
Exécutez l'intelligence de votre propre bibliothèque python avec VScode.
De la construction de l'environnement au déploiement pour flask + Heroku avec Docker
Exécutez LINE Bot implémenté en Python (Flask) "sans utiliser Heroku"
Comment exécuter une application construite avec Python + py2app construite avec Anaconda
Créer un babillard Heroku, Flask, Python, Nyanko avec "fichier csv"
Le point culminant de la construction de site normal REST + avec Flask, Eve
Déployez Flask avec ZEIT maintenant
Application Todo avec le plugin django-bootstrap-modal-forms
Exécutez python avec PyCharm (Windows)
Bonjour le monde avec Flask + Hamlish
Insérez le débogueur avec le nez
Exécutez Python avec CloudFlash (arm926ej-s)