[PYTHON] Étapes pour configurer Pipenv, créer une application CRUD avec Flask et la conteneuriser avec Docker

Contexte de la rédaction de l'article

Je vais prendre ma retraite de mon SIer actuel ce mois-ci, et je pense devenir ingénieur en infrastructure. Lors de la création d'une infrastructure et d'un environnement CI / CD qui utilise pleinement les clouds publics ces dernières années, même un ancien ingénieur comme moi devrait éviter de créer des applications dans différentes langues ou de créer des applications pour vérifier la communication. C'est à cette époque que je sens que je ne peux plus passer.

Je voulais faire de mon mieux pour créer divers langages et créer une petite application Web, alors cette fois j'ai décrit la procédure pour créer une application Flask (en la touchant juste) avec Python et Pipenv et en faire un conteneur Docker.

Installation de Pipenv

Ces dernières années, la construction de l'environnement Python semble être construite à l'aide d'un outil appelé Pipenv, j'ai donc essayé de l'utiliser. C'est comme JavaScript npm et facile à utiliser.

pip install pipenv

Créer un projet d'application

mkdir flask-app
cd flask-app

Cette fois, j'utiliserai Python 3.8.

pipenv --python 3.8
pipenv install flask
pipenv install --dev autopep8

Créez un fichier vide à créer.

mkdir src
touch src/main.py
touch Dockerfile
touch .dockerignore

Ajoutez à la section scripts du Pipfile.

[scripts]
start = "python src/main.py"

Codage de l'application Flask

Ce sera du code écrit par un amateur de Python, mais je l'ai créé comme suit.

src/main.py


import sqlite3
import flask

app = flask.Flask(__name__)


def get_db():
    db = getattr(flask.g, '_database', None)
    if db is None:
        db = flask.g._database = sqlite3.connect('mydb.sqlite')
    return db


@app.teardown_appcontext
def close_conn(exception):
    db = getattr(flask.g, '_database', None)
    if db is not None:
        db.close()


@app.route('/todos/<id>', methods=['GET'])
@app.route('/todos', methods=['GET', 'POST'])
def todos(id=None):
    db = get_db()

    #Créez une table lorsque vous recevez une demande
    curs = db.cursor()
    curs.execute(
        'create table if not exists todos('
        'id integer primary key autoincrement, title string)'
    )

    id = flask.request.values.get('id', id)

    if flask.request.method == 'GET' and id is not None:
        curs.execute('select * from todos where id = {}'.format(id))
        response = curs.fetchone()
        if response is not None:
            id, title = response
            return flask.jsonify(todo={"id": id, "title": title}), 200

        return flask.jsonify(message='resource not found'), 400

    if flask.request.method == 'GET':
        curs.execute('select * from todos')
        response = curs.fetchall()
        todos = []
        for todo in response:
            id, title = todo
            todos.append({"id": id, "title": title})

        return flask.jsonify(todos=todos), 200

    if flask.request.method == 'POST':
        title = flask.request.json['title']
        curs.execute('insert into todos(title) values("{}")'.format(title))
        db.commit()
        return flask.jsonify(message='created new toto')


def main():
    app.debug = True
    app.run(host='0.0.0.0', port=5000)


if __name__ == "__main__":
    main()

À ce stade, il devrait fonctionner dans votre environnement local.

pipenv run start

 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 208-926-045

Appuyez sur la commande curl pour vérifier.

curl -XPOST -H 'Content-Type: application/json' localhost:5000/todos -d '{"title": "new task1"}'
curl -XPOST -H 'Content-Type: application/json' localhost:5000/todos -d '{"title": "new task2"}'
curl localhost:5000/todos
curl localhost:5000/todos/1

Créer et construire un Dockerfile

Je ne connais pas la pratique en combinaison avec Pipenv, mais je l'ai fait avec Simple is Best.

FROM python:3.8

ENV LC_ALL=C.UTF-8 \
    LANG=C.UTF-8

WORKDIR /app
COPY . .

RUN pip install pipenv
RUN pipenv install

CMD ["pipenv", "run", "start"]

EXPOSE 5000

Créez également un fichier .dockerignore.

.dockerignore


*.sqlite
.git

Construire.

docker image build -t flaskapp:latest . 

Démarrez le conteneur (en commençant le port local en tant que 15000).

docker container run -it -p 15000:5000 --rm flaskapp:latest

 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 954-331-726

C'est OK si vous pouvez confirmer en appuyant sur la commande curl.

curl -XPOST -H 'Content-Type: application/json' localhost:15000/todos -d '{"title": "new task1"}'
curl -XPOST -H 'Content-Type: application/json' localhost:15000/todos -d '{"title": "new task2"}'
curl localhost:15000/todos
curl localhost:15000/todos/1

en conclusion

J'étais habitué à npm et yarn dans nodejs, j'ai donc évité de créer un environnement python, mais j'ai trouvé Pipenv utile. Je ne connaissais pas Pipenv, alors j'avais l'impression de l'avoir perdu.

Pour l'instant, du point de vue d'un ingénieur infrastructure (subjectif), je suis satisfait car je l'ai fait jusqu'à présent. Nous ferons de notre mieux pour fournir l'environnement sans déranger l'ingénieur d'application.

Cependant, même si je ne me souvenais pas beaucoup jusqu'à il y a environ cinq ans, les changements dans l'environnement entourant la technologie informatique de nos jours sont énormes. Il a été laissé pour compte, mais j'essaie désespérément de le rattraper.

Recommended Posts

Étapes pour configurer Pipenv, créer une application CRUD avec Flask et la conteneuriser avec Docker
Je veux créer un fichier pip et le refléter dans le menu fixe
Créez une application Web simple avec Flask
Créer un service Web avec Docker + Flask
Définissez la fonction Lambda et laissez-la fonctionner avec les événements S3!
Étapes pour créer un bot Twitter avec Python
Procédure de création d'application multi-plateforme avec kivy
Créez une application flask faite avec tensorflow et dlib pour travailler sur centos7
Créez une application Web qui convertit le PDF en texte à l'aide de Flask et PyPDF2
Notez que j'étais accro à la configuration de TensowFlow
Créez une application graphique native avec Py2app et Tkinter
[Linux] Créez un auto-certificat avec Docker et apache
De l'introduction de Flask sur CentOS au service sur Nginx et uWSGI
C'était un peu difficile de faire flacon avec la version docker de nginx-unit
Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS
Étapes pour créer rapidement un environnement d'apprentissage en profondeur sur Mac avec TensorFlow et OpenCV
Comment déployer une application Web créée avec Flask sur Heroku
Comment configurer WSL2 sur Windows 10 et créer un environnement d'étude pour les commandes Linux
Créez un script de déploiement avec fabric et cuisine et réutilisez-le
Créer une application Todo avec Django ① Créer un environnement avec Docker
Comment définir un raccourci pour basculer entre pleine largeur et demi-largeur dans IBus
Créez un fichier temporaire avec django sous forme de zip et renvoyez-le
J'ai essayé de créer des taureaux et des vaches avec un programme shell
Étapes pour créer un projet Django
Créer un serveur Flask avec Docker
Configurez un serveur de référentiel yum sur la série CentOS 7 et faites-y référence localement et à partir d'autres serveurs, etc.
Introduction et utilisation de la bouteille Python ・ Essayez de configurer un serveur Web simple avec une fonction de connexion
Envoyez du courrier avec mailx à un serveur SMTP factice configuré avec python.
Créez une application Django sur Docker et déployez-la sur AWS Fargate
Procédure de création d'un environnement virtuel Python avec VS Code sous Windows
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
Comment rendre le nom du conteneur accessible dans Docker en tant que sous-domaine
Créer une application Todo avec Django ④ Implémenter la fonction de création de dossier et de tâche
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (5. Entropie des informations)
Créer une application graphique avec Tkinter de Python
J'ai trouvé un moyen de créer un modèle 3D à partir d'une photo Partie 02 Chargement d'images et dessin de sommets
Créer une application Python-GUI dans Docker (PySimpleGUI)
Créez une application simple qui intègre l'API Fetch pour les requêtes Ajax dans Flask et expliquez-la rapidement.
Créez une API pour convertir des fichiers PDF en images TIF avec FastAPI et Docker
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
Utilisez la commande [shell] pour compresser par zip n'importe quel fichier pour créer un fichier et supprimer le fichier d'origine.
Créez un graphique empilé correspondant aux directions positives et négatives avec matplotlib
Installer et configurer Jupyter Notebook pour créer un environnement de création de notes d'étude [Mac]
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
J'ai essayé de créer un projet en utilisant Python sur Docker avec PyCharm, mais cela a fonctionné avec Docker Compose
Configurer un serveur HTTPS simple avec asyncio
Configurer un serveur local avec le téléchargement Go-File-
Créez une application de composition d'images avec Flask + Pillow
Créer un babillard avec Heroku, Flask, SQL Alchemy
Configurer un serveur local avec le téléchargement Go-File-
Comment préparer l'environnement pour Google Colab avec le cours avancé d'apprentissage automatique de Coursera
Comment configurer une passerelle VPN pour établir une connexion entre Alibaba Cloud et AWS
[Introduction au trading système] J'ai dessiné un oscillateur stochastique avec python et joué avec ♬