Sekarang, untuk membuat kelas model saya perlu memiliki aplikasinya, seperti:
# apps.members.modelsfrom flask import current_app
from flaskext.sqlalchemy importSQLAlchemy
db =SQLAlchemy(current_app)classMember(db.Model):# fields herepass
Tetapi jika saya mencoba dan mengimpor model itu ke dalam aplikasi Blueprint saya, saya merasa ditakuti RuntimeError: working outside of request context. Bagaimana saya bisa mendapatkan aplikasi saya dengan benar di sini? Impor relatif mungkin berfungsi tetapi sangat buruk dan memiliki masalah konteksnya sendiri, misalnya:
# apps.applicationfrom flask importFlaskfrom apps.shared import db
from apps.reporting.routes import reporting
app =Flask(__name__)
db.init_app(app)
app.register_blueprint(reporting)
Catatan: ini adalah sketsa dari beberapa kekuatan yang diberikan ini - jelas ada sedikit lebih banyak yang dapat Anda lakukan untuk membuat pengembangan lebih mudah (menggunakan create_apppola, cetak biru pendaftaran otomatis di folder tertentu, dll.)
Bisakah Anda melakukannya berkali-kali? Misalnya jika saya memiliki lebih dari satu file models.py?
Brad Wright
@BradWright - membuatnya lebih mudah jika Anda hanya membuat dbinstance untuk setiap database yang Anda miliki. Jika Anda memiliki paket model, Anda dapat memasukkannya ke dalamnya __init__.py. Bagaimanapun Anda memilih untuk melakukannya, Anda cukup mengimpor dbvariabel dari lokasi itu ke file model Anda yang lain dan menggunakannya seperti biasa. Ketika mereka dimuat semuanya diselesaikan dengan benar.
Sean Vieira
1
Apakah Anda kebetulan memiliki tautan ke proyek yang disiapkan dengan cara ini?
...
app = flask.Flask(__name__)
app.config['DEBUG']=True
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:////tmp/test.db'
db = flask.ext.sqlalchemy.SQLAlchemy(app)classPerson(db.Model):
id = db.Column(db.Integer, primary_key=True)...classComputer(db.Model):
id = db.Column(db.Integer, primary_key=True)...# Create the database tables.
db.create_all()...# start the flask loop
app.run()
Saya baru saja memisahkan satu app.py ke app.py dan model.py tanpa menggunakan Blueprint. Dalam hal ini, jawaban dosen tidak berfungsi. Kode baris diperlukan untuk bekerja.
db.app = appmendapatkan runtimeerror karena init_app tidak menyetel aplikasi. +1
Amit Tripathi
3
db.app = app(diikuti oleh db.init_app(app)) adalah bagian yang hilang bagi saya. Bekerja dengan sempurna setelah menambahkan garis itu (dikombinasikan dengan jawaban Sean Vieira)
db
instance untuk setiap database yang Anda miliki. Jika Anda memiliki paket model, Anda dapat memasukkannya ke dalamnya__init__.py
. Bagaimanapun Anda memilih untuk melakukannya, Anda cukup mengimpordb
variabel dari lokasi itu ke file model Anda yang lain dan menggunakannya seperti biasa. Ketika mereka dimuat semuanya diselesaikan dengan benar..ext.
namespace sudah ditinggalkan - lebih baik untuk impor dari namespace nyata (flask_sqlalchemy
).app.py asli : https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/
Saya baru saja memisahkan satu app.py ke app.py dan model.py tanpa menggunakan Blueprint. Dalam hal ini, jawaban dosen tidak berfungsi. Kode baris diperlukan untuk bekerja.
sebelumnya :
setelah :
Dan, tautan berikut sangat berguna.
http://piotr.banaszkiewicz.org/blog/2012/06/29/flask-sqlalchemy-init_app/
sumber
db.app = app
mendapatkan runtimeerror karena init_app tidak menyetel aplikasi. +1db.app = app
(diikuti olehdb.init_app(app)
) adalah bagian yang hilang bagi saya. Bekerja dengan sempurna setelah menambahkan garis itu (dikombinasikan dengan jawaban Sean Vieira)