[PYTHON] La structure des dossiers de Flask est résumée

Une personne qui développe des systèmes Web en utilisant Django tout le temps. J'ai récemment commencé à étudier Flask parce que je veux créer une application simple pendant mon temps libre. Il n'est pas bon de regrouper trop de paramètres dans un seul fichier, j'ai donc résumé la structure des répertoires basée sur MVC.

flask_app
├ common
│ ├ libs
│ └ models  ---modèle
│   ├ user.py
│ └ ・ ・ ・
├ config ---Dossier de paramètres
│ ├ base_setting.py ---Paramètres communs pour chaque environnement
│ ├ local_setting.py ---Paramètres de l'environnement de développement local
│ └ production_setting.py ---Paramètres de l'environnement de production
├ controllers ---manette
│ ├ index.py
│ └ ・ ・ ・
├ interceptors 
│ ├ auth.py ---Traitement du système d'authentification
│ └ error_handler.py ---La gestion des erreurs
├ static ---Emplacement du fichier statique
├ templates ---modèle
│ ├ common
│ │ └ layout.html
│ └ index.html
├ application.py ---Définissez ce qui est utilisé par plusieurs fichiers (instance Flask, DB, variables d'environnement, etc.)
├ manager.py ---Script d'exécution d'application (entrée d'application)
├ requirements.py ---Liste de la bibliothèque
└ www.py ---routage

Flux d'exécution

Description du rôle du fichier

Je vais expliquer dans l'ordre.

app.config.from_pyfile("config/base_setting.py")Lisez d'abord les paramètres communs avec. Les paramètres qui changent en fonction de l'environnement (développement / production) sont les variables d'environnement prédéfinies ops._Changé pour lire un fichier de paramètres différent en fonction de la valeur différente de config.




#### **`flask_app/application.py`**
```flask

from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
import os
app = Flask(__name__)

manager = Manager(app)
app.config.from_pyfile("config/base_setting.py")

# linux export ops_config=local|production
# windows set ops_config=local|production
if "ops_config" in os.environ:
    app.config.from_pyfile("config/%s_setting.py" % (os.environ['ops_config']))

db = SQLAlchemy(app)

Le contenu des contrôleurs est divisé en unités fonctionnelles et intégré à l'aide d'un plan sur www.py.

flask_app/www.py


from interceptors.errorHandler import *
from interceptors.Auth import *
from application import app
from controllers.index import index_page

from flask_debugtoolbar import DebugToolbarExtension
toolbar = DebugToolbarExtension(app)


app.register_blueprint(index_page, url_prefix="/")

Définissez le modèle dans les modèles. Ici, un modèle de test est défini dans user.py.

flask_app/common/models/user.py


from application import db


class User(db.Model):
    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(20), nullable=False)

Définissez le traitement réel dans les contrôleurs.

flask_app/controllers/index.py


from flask import Blueprint, render_template
from common.models.user import User

index_page = Blueprint("index_page", __name__)


@index_page.route("/")
def index():
    name = "hello"
    context = {"name": name}
    context["user"] = {"nickname": "xxxx",
                       "id": "xxxxx", "home_page": "http://www.xxx"}
    context["num_list"] = [1, 2, 3, 4, 5]

    result = User.query.all()
    context['result'] = result

    return render_template("index.html", **context)

Enregistrez les commandes runserver et create_all avec la méthode add_commend de Manager.

flask_app/manager.py


 from application import app, db, manager
from flask_script import Server, Command
from www import *

# web server
manager.add_command("runserver", Server(host = "0.0.0.0", use_debugger=True, use_reloader=True))

# create tables
@Command
def create_all():
    from common.models.user import User  
    db.create_all()

manager.add_command("create_all", create_all)

def main():
    manager.run()
    
if __name__ == "__main__":
    # app.run( host = "0.0.0.0" )
    
    try:
        import sys
        sys.exit( main() )
    except Exception as e:
        import traceback
        traceback.print_exc()

Courir

http://localhost:Accédez à 5000 et réussissez lorsque l'écran suivant apparaît!


 ![flask_app_image.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545184/b64db0c9-64cf-0b1b-e7a8-9935f14b5008.jpeg)


## La source
 J'ai téléchargé la source sur gitHub, donc si vous avez le temps, veuillez [Télécharger](https://github.com/shixujapan/flask_app) et jouer avec.
## Que faire ensuite

 * Créez une application CRUD simple à l'aide de Flask
 * Envisagez une coopération avec Vue.js


Recommended Posts

La structure des dossiers de Flask est résumée
J'ai résumé 11 types de systèmes d'exploitation
J'ai étudié le mécanisme de connexion flask!
[Python] Organiser la structure de base de l'application Flask (Viser la dé-copie)
[Super basiques de Python] J'ai appris les bases des bases, donc je l'ai résumé brièvement.
J'ai résumé comment changer les paramètres de démarrage de GRUB et GRUB2
J'ai vérifié le contenu du volume du docker
J'ai essayé le serveur asynchrone de Django 3.0
Je ne connaissais pas les bases de Python
[Python] J'ai personnellement résumé la grammaire de base.
Le modèle de projet Python auquel je pense.
[J'ai touché le Raspberry Pi (1)] J'ai résumé les opérations de base de Minecraft Pi Edition (2015.5.23 pré-version)
Puisque l'extraction des synonymes à l'aide de Word2Vec s'est bien déroulée, j'ai essayé de résumer l'analyse
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé l'analyse par grappes de la carte météo
J'ai lu l'implémentation de range (Objects / rangeobject.c)
J'ai résolu le problème le plus profond d'Hiroshi Yuki.
J'ai touché Flask
J'ai essayé Flask avec des conteneurs distants de VS Code
J'ai résumé l'année où j'ai étudié la science des données par moi-même.
J'ai vérifié la liste des touches de raccourci de Jupyter
J'ai essayé de corriger la forme trapézoïdale de l'image
Essayez Progate Free Edition [Python I]
J'ai vérifié la période de rétention de session de django
J'ai vérifié la vitesse de traitement de la numpy unidimensionnelle
J'ai touché certaines des nouvelles fonctionnalités de Python 3.8 ①
J'ai lu et implémenté les variantes de UKR
Je souhaite personnaliser l'apparence de zabbix
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
Calculer le volume à partir de la structure bidimensionnelle d'un composé
Je veux grep le résultat de l'exécution de strace
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
J'ai suivi la mise en place de la commande du (première moitié)
J'ai comparé l'identité des images par moment Hu
Peut-être ai-je surestimé l'impact de Shell Shock sur CGI
J'ai vérifié les spécifications de sortie du LSTM bidirectionnel de PyTorch
J'ai vérifié les versions de Blender et Python
Je veux bien comprendre les bases de Bokeh
Les performances de PHP étaient meilleures que ce à quoi je m'attendais
J'ai examiné l'argument class_weight de la fonction softmax_cross_entropy de Chainer.
J'ai mesuré les performances d'un million de documents avec mongoDB
J'ai vérifié le système d'exploitation et le shell par défaut de docker-machine
J'ai suivi la mise en place de la commande du (seconde moitié)
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de gratter la publicité du site de dessin animé piraté
J'ai étudié l'algorithme d'apprentissage de renforcement du trading d'algorithmes
J'ai essayé la méthode la plus simple de classification de documents multi-étiquettes
J'ai essayé de classer les voix des acteurs de la voix
Je souhaite augmenter la sécurité de la connexion SSH
J'ai recherché le contenu de l'agent CloudWatch Logs
J'ai essayé d'exécuter l'exemple de code du module Ansible
J'ai essayé de résumer les opérations de chaîne de Python
Le début de cif2cell
Structure des dossiers pour l'analyse