Я исправил проблему с помощью шаблона Factory Factory . Я объявляю базу данных в третьем модуле и настраиваю ее позже в том же модуле, в котором я запускаю приложение.
Это приводит к следующим импортам:
Нет циклического импорта. Важно убедиться, что приложение было запущено и настроено перед вызовом операций с базой данных.
Вот пример приложения:
app.py
from database import db
from flask import Flask
import os.path
from views import User
from views import people
def create_app():
app = Flask(__name__)
app.config['DEBUG'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:////tmp/test.db"
db.init_app(app)
app.register_blueprint(people, url_prefix='')
return app
def setup_database(app):
with app.app_context():
db.create_all()
user = User()
user.username = "Tom"
db.session.add(user)
db.session.commit()
if __name__ == '__main__':
app = create_app()
# Because this is just a demonstration we set up the database like this.
if not os.path.isfile('/tmp/test.db'):
setup_database(app)
app.run()
database.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
views.py
from database import db
from flask.blueprints import Blueprint
people = Blueprint('people', __name__,
template_folder='templates',
static_folder='static')
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
@people.route('/')
def test():
user = User.query.filter_by(username="Tom").first()
return "Test: Username %s " % user.username
Метод .data () на объектах jQuery кэширует значение из начального чтения. Последующий вызов .data () сначала заглянет в хранилище данных jQuery и отправит вам это значение. .attr () не будет обновлять хранилище данных, но обновит атрибут в HTML. Используйте .data () или .attr (), но избегайте смешивания и сопоставления.
Не смешивайте это использование attr()
и data()
. data()
кэширует значение, которое он читает из элемента, и не обновляет атрибут. Так что, если вы обновите данные, attr не увидит их. Выберите одно или другое и придерживайтесь его.