[Mémo d'édition Flask] Un amateur qui ne comprend pas le HTML ou la construction Web essaie de créer un service Web avec Python + Flask

C'est un ingénieur du week-end par un amateur de gorge inexpérimenté Ceci est un article de mémo pour créer une application Web avec Python et Flask.

Page de destination [Flask] Cette page [Docker] Coming Soon… [Développement Web] http://qiita.com/yuusei/items/cf738b0849fc932a64e6

Cette page est la page principale de l'édition Flask, Le contenu utilisé pour l'implémentation, comme l'utilisation des modules et des classes, est principalement basé sur le site japonais officiel de Flask. Ce site a code Github "flaskr.py" qui vous permet de créer un service simplement en copiant et collant. Puis, notamment dans Tutorial, un microblog (un simple blog avec seulement le titre et le texte. Tweet Twitter) dont un exemple de code est publié. C'est comme lire le code (qui a un titre pour chacun) et organiser ce que vous pouvez comprendre.

Notez que la plus petite application Web que vous pouvez créer avec Flask a une application «Hello World» avec seulement 9 lignes. Vous pouvez le faire tout de suite avec une copie, alors essayez-le.

Mémo des connaissances de base de Flask

・ Qu'est-ce que Flask? Microframework pour le développement Web ・ Un cadre est comme une "boîte à jouets" ・ Les «jouets» inclus dans le cadre de consultation sont des systèmes stratégiques tels que «l'analyse SWOT» -Les "jouets" inclus dans le framework pour les créateurs Web sont des bibliothèques dans lesquelles de nombreuses personnes ont écrit du code. ・ Des frameworks Web existent pour chaque langage de développement, tout comme le framework de conseil diffère selon l'entreprise ou l'industrie. ・ Pour Python, "Django" est le courant dominant. C'est un framework tout-en-un qui peut gérer des cadres de taille moyenne. -Même avec le même framework Web Python, «Flask» est «semblable à un langage de programmation» pour «des fins de développement à petite échelle» par rapport à «Django».

Liste des modules minimum requis dans Flask

Module «Flacon» ・ Aucune explication requise. Un module qui vous permet d'utiliser Flask. -Strictement parlant, Flask peut être utilisé en important les classes "Flask" et "request" de ce module "flask".

seulement ça. Il semble que vous puissiez créer une application Web minimale avec juste ce "flacon". Référence: Application Web minimale pouvant être créée avec Flask

Mais, eh bien, il y a quelques modules supplémentaires nécessaires pour créer une application de microblogging dans Tutorial. Module "Os" -Un module qui reproduit les fonctions d'un OS général. -Vous pouvez utiliser les commandes Unix que vous tapez dans l'invite de commande pour Windows OS et Terminal pour Mac OS. ・ Bien qu'il ne soit pas complet, les principaux sont répertoriés.

Module «Sqlite3» -Un module de connexion et d'exploitation du DB. -Lorsqu'un service Web est publié, il sera nécessaire d'enregistrer l'ID utilisateur et les attributs au format RDB. Il. -Comme son nom l'indique, vous pouvez effectuer les mêmes opérations qu'en utilisant SQLlite. -Il n'est pas nécessaire de l'utiliser comme une application de connexion SQL ou DB distincte. J'utilise juste ceci dans le didacticiel.

(Je m'en fiche, mais quand j'écrivais cet article, j'ai entendu une conversation disant "Je pensais que je ne pouvais pas écrire ce SQL", et j'ai été choquée pendant un moment.)

Ensuite, utilisez pleinement les classes de ces modules pour créer une application de microblog.

Liste des objets de bibliothèque de classes de module autres que Flask stockés dans le module flask (utilisé dans le didacticiel)

“Flask” -Une classe pour utiliser Flask. -Pour faire une déclaration pour créer une application. ・ Utilisé avec app = Flask (name) etc.

“request” -Bibliothèque de commandes pour la gestion du HTML installée en Python ・ Il semble qu'il a été créé car urllib est difficile à comprendre

“session” -Il semble être pour gérer la connexion et la déconnexion.

“g” -Un objet qui stocke la connexion DB d'origine Flask -Une fois le format de connexion enregistré, il peut être utilisé à partir d'une autre fonction.

“redirect” ・ [Redirection HTTP](http://e-words.jp/w/HTTP Redirect.html) ・ Avis de changement d'URL

“url_for” -Pour générer des URL. -Il semble qu'il puisse également être utilisé pour la Génération d'URL dynamique. Cela semble être parfait pour créer ma page pour les nouveaux utilisateurs.

“abort” -Reporter une erreur au client (?) -Utilisé pour afficher ce qu'on appelle erreur client

“render_template” -Pour appeler le modèle requis depuis Template et rendre = lire le code du programme sous forme d'image ・ Je me suis demandé s'il serait extrait de Jinja2 ici.

“flash” -Comment afficher Flash et fournir des caractères / images au client

Un tel endroit. Ceci termine flaskr.py pour flaskr lui-même.

Structure du répertoire

Dans le mémo de structure de répertoire de service Web Développement Web,

・ Il n'y a pas de structure optimale. Il n'y a que le répertoire racine (/)

Je l'ai écrit, mais cela seul est trop sauvage, donc Flask crée la structure de répertoire comme ceci.

-Dossier de stockage Dossier "/ flaskr" pour stocker le module principal et le schéma de base de données ・ CSS et JS sont placés directement sous le dossier «flask», et le dossier «/ static» est utilisé par les utilisateurs. ・ De même, un dossier "/ templates" pour rechercher des templates Jinja2 directement sous "flaskr"

Il ya trois. De plus, y compris les fichiers nécessaires La structure des répertoires est la suivante.

Flaskr_DirectryTree.png

À propos de la conception de la base de données (schéma)

Une seule table est requise pour l'application de microblogging présentée dans Tutoriel.

Faites un commentaire en ligne sur la commande de création de schéma de base de données du didacticiel (https://flask-docs-ja.readthedocs.io/en/latest/tutorial/schema/#tutorial-schema).

drop table if exists entries;

Si vous avez déjà une table nommée "entrées", supprimez-la

#Manners pour créer une nouvelle table create table entries ( Déclaration pour créer une table appelée "entrées" avec le contenu écrit en # {}; id integer clé primaire auto-incrément, #column "id" Utilisé comme clé primaire de type entier (numérotation automatique) Chaîne de titre non nulle, #define la colonne "titre" sous forme de chaîne. La valeur nulle n'est pas possible chaîne de texte non nulle # Définit la colonne "texte" sous forme de chaîne. La valeur nulle n'est pas possible );

En regardant d'abord l'interface utilisateur complète de ce service, cela ressemble à ce qui suit.

flaskr_top_image.png

Si vous entrez le titre et le texte ici, l'identifiant sera attribué par numérotation automatique, puis Vous pouvez voir que le message est reflété.

Par exemple, si vous souhaitez étendre cet écran pour refléter la date comptable, Mettez une phrase dans le schéma ci-dessus à l'avance et préparez un champ de date d'auto-incrémentation dans la table.

Ce schéma est stocké sous forme de fichier "schema.sql" directement sous le répertoire flaskr.

Explication pour chaque partie du corps principal "flaskr.py"

J'ai mis le fichier de paramétrage de l'application sous flaskr.py dans la même hiérarchie (directement sous flaskr). De même, j'ajouterai des commentaires en ligne.

Déclaration et configuration de l'application

""" create our little application :)""" app = Flask(name) #Créer une instance (WSGI cette fois) avec le nom "nom" de la classe Flask importée

Lors de l'utilisation en tant que module unique, définissez-le sur "nom" afin qu'il n'interfère pas avec le "principal" de la destination d'importation.

# Load default config and override config from an environment variable app.config.update(dict(

Déclaré pour définir la configuration de l'application au format dict

DATABASE = os.path.join (app.root_path, 'flaskr.db'), #DB utilise le chemin racine "flaskr.db" DEBUG = True, #Debug SECRET_KEY = 'clé de développement', #Key pour sécuriser les sessions côté client USERNAME = 'admin', # Nom à saisir avec les privilèges d'administrateur PASSWORD = 'default' # PW à saisir avec les privilèges d'administrateur )) app.config.from_envvar('FLASKR_SETTINGS', silent=True) Code auquel se référer lorsque #config est enregistré dans un fichier séparé Ne laissez pas Flask passer tout ce qui n'est pas défini avec # silent = True.

Ceci termine les réglages. Ensuite, la commande pour se connecter à la base de données

Connexion et initialisation à la base de données

def connect_db(): Définissez la fonction qui se connecte à #DB comme "connect_db" #Connect, changez le format avec les données en taple-> dict, et retournez la ligne de type dict comme rv """Connects to the specific database.""" rv = sqlite3.connect (app.config ['DATABASE']) Connectez-vous à l'ensemble de bases de données dans # app.config rv.row_factory = sqlite3.Row # row peut être conservé au format dict au lieu de taple return rv

Utilisez cette fonction prédéfinie "connect_db" pour définir "init_db" qui initialise le DB une fois avant une nouvelle connexion.

def init_db(): """Initializes the database.""" db = get_db () # db stocke la base de données en tant que variable avec app.open_resource ('schema.sql', mode = 'r') as f: # Stocke le schéma dans "f" en mode lecture seule Utilisez db.cursor (). Executescript (f.read ()) # f.read () comme sql et enregistrez comme curseur db.commit () #commit to db-> initialisé

Voir Cliquez ici pour les curseurs SQL. Le curseur semble être une fonction qui vous permet de traiter des données ligne par ligne sur SQL. Cependant, en lisant l'explication sur le curseur de spliete3 Remplacez simplement l'instruction SQL Select par le curseur (). J'ai l'impression d'utiliser executescript. À propos, pour utiliser cette fonction init_db () dans CUI, le périphérique suivant est requis.

@ app.cli.command ('initdb') # Ajout d'une nouvelle commande "initdb" à l'interface de ligne de commande def initdb_command (): Tapez # initdb pour appeler la fonction init_db () et obtenir "initialized" """Creates the database tables.""" init_db() print('Initialized the database.')

Vous disposez maintenant d'un environnement pour initialiser la base de données à partir de CUI (est-il pratique d'avoir un environnement de test?). Et, en premier lieu, puisque la fonction de connexion à DB n'est pas définie, elle est définie.

def get_db(): """Opens a new database connection if there is none yet for the current application context. """ if not hasattr(g, 'sqlite_db'): g.sqlite_db = connect_db() return g.sqlite_db

Lorsque cette fonction se connecte au DB pour la première fois, elle enregistre les paramètres et effectue le travail de "connexion au DB pour chaque requête". Par exemple, je fais référence à ce domaine. Et nous définissons la déconnexion ci-dessous en disant que nous devons nous déconnecter une fois que nous nous connectons.

@app.teardown_appcontext def close_db(error): """Closes the database again at the end of the request.""" if hasattr(g, 'sqlite_db'): g.sqlite_db.close()

Cela n'a pas d'importance, mais au début, je ne savais pas ce qu'était ce hasattr, mais cela ressemble à une fonction intégrée en python.

The arguments are an object and a string. The result is True if the string is the name of one of the object’s attributes, False if not. (This is implemented by calling getattr(object, name) and seeing whether it raises an exception or not.) from Python-Official

Il est utilisé par hasattr (objet, nom) et semble retourner True si le nom est inclus dans l'objet. Dans ce cas, si sqlite_db est ouvert (a été connecté), il semble être fermé par g.sqlite_db.close (). Initdb pour get_db () et close_db () est la fin du traitement lié à la base de données.

Afficher la fonction / connexion / déconnexion

Ensuite, définissez quatre fonctions d'affichage pour afficher le contenu du DB (contenu publié) sur l'écran de l'application. "Afficher (toutes) les entrées", "Ajouter une nouvelle entrée", "Connexion" et "Déconnexion" respectivement.

Puis un par un ... Je vais terminer rapidement.

(Tout) Affichage d'entrée

@app.route('/') def show_entries(): db = get_db() cur = db.execute('select title, text from entries order by id desc') entries = cur.fetchall() return render_template('show_entries.html', entries=entries)

Ce que je veux voir ici est "cur = db.execute ('select title, text from entries order by id desc')". Si vous comprenez SQL, vous pouvez facilement le comprendre, mais cette commande () contient du SQL. Ainsi, execute («instruction SQL») exécute sql vers db.

select title , text from entries order by id desc

Peut-être que cela a quelque chose à voir avec l'instruction de curseur que j'ai écrite il y a quelque temps (db.cursor (). Executescript (f.read ())). Quoi qu'il en soit, cela est réécrit et l'élément récupéré par "fetchall ()" est rendu par "render_template". Les règles de rendu sont définies dans "show_entries.html". En tant que version étendue, si vous souhaitez récupérer la date, vous devez ajouter "date" au schéma de base de données et le SQL ci-dessus, et réécrire "show_entries.html" pour afficher la date.

Ajouter une nouvelle entrée

@app.route('/add', methods=['POST']) def add_entry(): if not session.get('logged_in'): abort(401) db = get_db() db.execute('insert into entries (title, text) values (?, ?)', [request.form['title'], request.form['text']]) db.commit() flash('New entry was successfully posted') return redirect(url_for('show_entries'))

En tant que fonction, le flux suivant est défini comme la fonction add_entry ().

"Renvoyer 401 si non connecté" -> "Se connecter à la base de données si connecté" -> "Exécuter la commande pour saisir" titre "et" texte "comme nouvelles entrées dans le DB connecté" -> "Confirmer le traitement avec commit ()" -> "Affichage flash que l'entrée a été publiée" -> "Recharger le navigateur et appeler" show_entries "pour tout réafficher"

est.

S'identifier

@app.route('/login', methods=['GET', 'POST']) def login(): error = None if request.method == 'POST': if request.form['username'] != app.config['USERNAME']: error = 'Invalid username' elif request.form['password'] != app.config['PASSWORD']: error = 'Invalid password' else: session['logged_in'] = True flash('You were logged in') return redirect(url_for('show_entries')) return render_template('login.html', error=error)

En tant que fonction, le flux suivant est défini comme la fonction login ().

"Aucune gestion des erreurs" -> "Vérifier si POST est demandé" -> "Vérifier si le nom d'utilisateur est dans la liste des utilisateurs existante (retourner une erreur si non)" -> "Vérifier si PW est dans PW existant (retourner une erreur si non)" -> "Définir la session de connexion sur True" -> "Connexion Flash réussie" -> "Recharger le navigateur et appeler" show_entries "pour tout réafficher" (-> Lorsque la gestion des erreurs n'est pas Aucune, l'écran au moment de l'erreur de connexion est rendu à partir du modèle)

est.

Se déconnecter

@app.route('/logout') def logout(): session.pop('logged_in', None) flash('You were logged out') return redirect(url_for('show_entries'))

En tant que fonction, le flux suivant est défini comme une fonction logout ().

"Renvoyer connecté à Aucun" -> "Afficher" déconnecté "en flash" -> "Recharger le navigateur et appeler" show_entries "pour tout réafficher"

est. Étonnamment facile.

Cela couvre le contenu de flaskr.py. Le reste concerne le HTML, donc au lieu de l'écrire ici Je vais mettre un lien vers le cadre HTML et CSS dans Développement Web.

Continuer···

Autres notes simples sur le framework Web ・ Pour Ruby, "Ruby on Rails". La vitesse du développement se vend ・ Pour PHP, "CakePHP". En regardant le monde, il semble que "la plupart des applications Web ont été introduites" ・ Pour Java, "Spring" ou "Play". Il semble que ce soit une phase de sélection à partir du groupe de division masculine ・ Pour JavaScript, "AngularJS". Il semble qu'il convient au développement d'applications qui peuvent être complétées d'une seule pièce. Est-ce une histoire de diapositives? -Pour CSS / JS, "Bootstrap". Il semble que Twitter fournit

Recommended Posts

[Mémo d'édition Flask] Un amateur qui ne comprend pas le HTML ou la construction Web essaie de créer un service Web avec Python + Flask
Créer un service Web avec Docker + Flask
J'ai créé un environnement pour Masonite, un framework WEB Python similaire à Laravel, avec Docker!
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
[GCP] Procédure de création d'une application Web avec Cloud Functions (Python + Flask)
Une introduction aux applications Web Python auto-conçues pour un ingénieur Web de troisième année paresseux
Mémo pour demander des KPI avec python
Créez une application Web simple avec Flask
[Python] Créez rapidement une API avec Flask
Créons une application Web de conversion A vers B avec Flask! De zéro ...
Recherche d'un moyen efficace d'écrire un Dockerfile avec Python avec de la poésie
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
Créer un LINE BOT avec Minette pour Python
Étapes pour créer un bot Twitter avec Python
Lancer un serveur Web avec Python et Flask
amateur python tente de résumer la liste ②
Construction d'environnement pour ceux qui veulent étudier Python facilement avec VSCode (pour Mac)
Créer un serveur local GIF animé avec Python + Flask
Mémo pour créer votre propre Box avec le Python de Pepper
Mémo connecté à HiveServer2 d'EMR avec python
Pourquoi ne pas créer facilement une table élégante avec Python?
[Python] Un mémo pour écrire du CSV verticalement avec Pandas
Créer une couche pour AWS Lambda Python dans Docker
Pour ceux qui veulent écrire Python avec vim
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Procédure de construction de l'environnement pour ceux qui ne sont pas familiarisés avec le système de gestion de version python
Suite [Python] Traduisons automatiquement le PDF anglais (mais sans s'y limiter) avec la traduction DeepL ou Google dans un fichier texte, pas de HTML.