Se connecter à une Base de données dans le Flacon, l'Approche Qui est mieux?
De la méthode: à l'Aide de g objet de http://flask.pocoo.org/docs/tutorial/dbcon/ et http://flask.pocoo.org/docs/patterns/sqlite3/
import sqlite3
from flask import g
DATABASE = '/path/to/database.db'
def connect_db():
return sqlite3.connect(DATABASE)
@app.before_request
def before_request():
g.db = connect_db()
@app.teardown_request
def teardown_request(exception):
if hasattr(g, 'db'):
g.db.close()
Deux méthode: à l'Aide de Mystérieux _app_ctx_stack de https://github.com/mitsuhiko/flask/blob/master/examples/flaskr/flaskr.py
from sqlite3 import dbapi2 as sqlite3
from flask import Flask, request, session, g, redirect, url_for, abort, \
render_template, flash, _app_ctx_stack
def get_db():
"""Opens a new database connection if there is none yet for the
current application context.
"""
top = _app_ctx_stack.top
if not hasattr(top, 'sqlite_db'):
top.sqlite_db = sqlite3.connect(app.config['DATABASE'])
return top.sqlite_db
@app.teardown_appcontext
def close_db_connection(exception):
"""Closes the database again at the end of the request."""
top = _app_ctx_stack.top
if hasattr(top, 'sqlite_db'):
top.sqlite_db.close()
Quelle méthode est la meilleure? Quelle est la différence?
- Mais, sans explication, soit: flask.pocoo.org/docs/extensiondev
Vous devez vous connecter pour publier un commentaire.
La différence entre les deux est que la méthode crée une connexion sur
g.db
si vous en avez besoin ou pas, tandis que la deuxième méthode uniquement crée la connexion lorsque vous appelezget_db
pour la première fois dans le contexte de l'application.Si vous comparez les deux, à l'aide de cette installation:
Vous verrez que quand vous frappez
/
à l'aide de la@app.before_request
setup (g.db
), vous obtenez une connexion si vous l'utilisez ou pas, tout en utilisant la_app_context
route, vous obtenez seulement une connexion lorsque vous appelezget_db
.Pour être juste, vous pouvez également ajouter un descripteur de
g
qui fera la même paresseux de la connexion (ou dans la vraie vie, l'acquisition d'une connexion à partir d'un pool de connexion). Et dans les deux cas, vous pouvez utiliser un peu plus de magie (werkzeug.local.LocalProxy
pour être précis) pour créer votre propre personnalisé thread local qui agit commeg
,current_app
etrequest
(entre autres).La première est la question de l'acquisition de connexions, même quand ils ne sont pas nécessaires. Le second a l'inconvénient de jouer avec les éléments internes d'un tiers cadre, et en plus c'est assez illisible.
Des deux à lui seul, le second est probablement le meilleur choix. Non seulement il n'est pas l'acquisition d'une connexion pour les routes qui n'en a pas besoin, il n'a pas d'acquérir la connexion si vous allez vers le bas tout chemin de code qui n'en a pas besoin, même si d'autres chemins du code de la route en nécessite un. (Par exemple, si vous avez une certaine forme de validation, vous avez seulement besoin de la connexion si la validation passe; ce n'est pas ouvrir un lors de la validation échoue.) Vous n'acquérir que des liens avant de les utiliser avec cette mise en place.
Cependant, vous pouvez éviter de jouer avec les éléments internes et de bénéficier de tous ces avantages. Personnellement, j'ai créé mes propres méthodes globales:
Puis, tout au long de l'application, toujours obtenir votre connexion via
get_request_connection
, comme vous le feriez pour votreget_db
fonction. Simple et d'une grande efficacité. Fondamentalement, le meilleur des deux mondes.Edit:
En y repensant, je n'aime vraiment pas le fait que ce sont des méthodes globales, mais je pense que la raison pour cela est parce que c'est comment Flacon de travaux: il vous donne "globals" qui fait le point sur le thread de gens du coin.
Je recommande En Flacon De SQLAlchemy, qui s'étend de SQLAlchemy pour une utilisation dans le Flacon, donc il prend en charge plusieurs bases de données différentes. (Exemple: Flacon-SQLAlchemy documentation)
De l'installation:
Maintenant, vous pouvez simplement importer/utilisation de la
User
classe d'accès de l'Utilisateur table dans votre base de données.Créer de nouveaux utilisateurs:
Ajoutez les utilisateurs à la base de données:
De requête pour les utilisateurs déjà dans la base de données:
Method One: Using special g object
OUMethod Two: Using Mysterious _app_ctx_stack
.J'irais avec la méthode plus lisible et moins "hackish".
La méthode 2 est probablement conçu pour flacon extensions de l'intégration (exemple et explication de l'app-ctx-pile). Même s'ils ont probablement très semblable effet, la méthode doit être utilisée pour les cas normaux.