美文网首页编程地带程序员
Flask学习(七) - models分类解决循环引用

Flask学习(七) - models分类解决循环引用

作者: MA木易YA | 来源:发表于2018-11-22 09:56 被阅读0次

    models分类解决循环引用

    其实学到这里发现很多机制和Django都很类似,可能原理性都差不多,只是实现的机制和功能上有不同点,Django上也是会单独分离出一个models.py文件单独作为对模型的处理,这里也是为了避免主文件里代码冗余影响可读性。
    比如之前的代码中,我们将对Article模型的建立模块单独到models.py文件里处理,

    • 但是这里就又出现了另外一个问题,处理模型板块需要db对象,如果这里引入主文件里面的db,主文件又引入models.py里面的Article,这里就出现了循环引用,类似while True的死循环
    • 为了解决这个问题,没错,就是再独立一个板块出来获取db对象,我们用exts.py表示(extension)
      exts.py
    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
    

    models文件直接从exts里面获取db

    models.py

    from exts import db
    
    class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        title = db.Column(db.String(10), nullable=False)
    

    主文件

    • 在创建SQLAlchemy对象时往往需要传入app对象,但是如果此时不方便传入,那么Flask也提供了相应的方法init_app()以对它进行初始化,此时在主文件里调用执行初始化也可以
    • 同学们在这里直接执行db.create_all()应该是会报错的,抛出应用未注册的错误,这涉及到应用里面的上下文知识,当你访问服务器时,它会自动把当前的app注册到服务器的栈上,但是如果你没有事先访问服务器,那么就需要手动添加,这里的app_context()方法即实现了此功能
      app.py
    from flask import Flask
    from models import Article#一定记得要导入模型,不然创建时不知道在哪里寻找模型
    from exts import db
    import config
    import pymysql
    
    app = Flask(__name__)
    app.config.from_object(config)
    db.init_app(app)
    
    with app.app_context():
        db.create_all()
    
    
    @app.route('/')
    def index():
        return 'index'
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    config里面设置数据库连接的配置

    config.py

    SQLALCHEMY_DATABASE_URI ='mysql+pymysql://root:299521@127.0.0.1:3306/demo1'
    
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    image.png
    image.png

    相关文章

      网友评论

        本文标题:Flask学习(七) - models分类解决循环引用

        本文链接:https://www.haomeiwen.com/subject/tndhqqtx.html