Domanda

Voglio strutturare la mia app di pallone come:

./site.py
./apps/members/__init__.py
./apps/members/models.py
.

apps.members è un progetto di pallone.

Ora, per creare le classi del modello ho bisogno di avere una presa dell'app, qualcosa del genere:

# apps.members.models
from flask import current_app
from flaskext.sqlalchemy import SQLAlchemy

db = SQLAlchemy(current_app)

class Member(db.Model):
    # fields here
    pass
.

Ma se cerco di importare quel modello nell'app della mia Blueprint, ottengo il temuto RuntimeError: working outside of request context.Come posso avere una tenuta della mia app correttamente qui?Le importazioni relative potrebbero funzionare ma sono piuttosto brutte e hanno i loro problemi di contesto, ad esempio:

from ...site import app

# ValueError: Attempted relative import beyond toplevel package
.

È stato utile?

Soluzione

Il modulo flask_sqlalchemy non deve essere inizializzato con l'app subito - puoi farlo invece:

# apps.members.models
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Member(db.Model):
    # fields here
    pass
.

E poi nella configurazione dell'applicazione è possibile chiamare init_app:

# apps.application.py
from flask import Flask
from apps.members.models import db

app = Flask(__name__)
# later on
db.init_app(app)
.

In questo modo è possibile evitare le importazioni cicliche.

Questo motivo esegue non richiede che tu posa tutti i tuoi modelli in un unico file.Importare semplicemente la variabile db in ciascuno dei moduli del modello.

Esempio

# apps.shared.models
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
.

# apps.members.models
from apps.shared.models import db

class Member(db.Model):
    # TODO: Implement this.
    pass
.

# apps.reporting.members
from flask import render_template
from apps.members.models import Member

def report_on_members():
    # TODO: Actually use arguments
    members = Member.filter(1==1).all()
    return render_template("report.html", members=members)
.

# apps.reporting.routes
from flask import Blueprint
from apps.reporting.members import report_on_members

reporting = Blueprint("reporting", __name__)

reporting.route("/member-report", methods=["GET","POST"])(report_on_members)
.

# apps.application
from flask import Flask
from apps.shared import db
from apps.reporting.routes import reporting

app = Flask(__name__)
db.init_app(app)
app.register_blueprint(reporting)
.

Nota: Questo è uno schizzo di parte del potere che ti dà - c'è ovviamente un po 'di più che puoi fare per rendere anche lo sviluppoPiù facile (utilizzando un modello create_app, la registrazione automatica dei progetti in determinate cartelle, ecc.)

Altri suggerimenti

Un originale app.pypy : https://flank-sqlalchemy.palletsprojects.com/en/2.x/quickstart/

...

app = flask.Flask(__name__)
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = flask.ext.sqlalchemy.SQLAlchemy(app)

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
...

class Computer(db.Model):
    id = db.Column(db.Integer, primary_key=True)
...

# Create the database tables.
db.create_all()

...

# start the flask loop
app.run()
.

Ho appena spinto una app.PY a App.PY e Model.PY senza usare il progetto.In tal caso, la risposta di cui sopra non funziona.Un codice di linea è necessario per funzionare.

Prima :

db.init_app(app)
.

dopo :

db.app = app
db.init_app(app)
.

E, il seguente collegamento è molto utile.

http://piotr.banaszkiewicz.org/banszkiewicz.orgBlog / 2012 / 06/29 / Flask-SQLalchemy-init_App /

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top