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.
・ 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».
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.
“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.
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.
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.
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.
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.
""" 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
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.
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.
@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.
@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.
@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.
@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