创建 Flask 项目的时候主注意的细节

2017-03-14 11:46:43 +08:00
 char1998

在使用Flask-migrateFlask-script的时候,一般使用以下的目录结构:

 - myapp
 --- app.py
 --- config.py
 --- exts.py
 --- manage.py
 --- models.py

以下对各个文件的作用进行解释:

  1. config.py:存放app配置的,一般把数据库的配置放在这个里面,比如代码如下:

    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'myapp'
    USERNAME = 'root'
    PASSWORD = 'root'
    DB_URI = 'mysql+mysqldb://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
    
  2. exts.py:把db=SQLAlchemy()这个变量放在这个文件中,而不是放在app文件中。这样做的目的是为了在大型项目中如果db被多个模型文件引用的话,会造成from your_app import db这样的方式,但是往往也在your_app.py中也会引入模型文件定义的类,这就造成了循环引用。所以最好的办法是把它放在不依赖其他模块的独立文件中。以后采用db.init_app(app)的方式和app进行绑定。

  3. models.py:这个文件存放所有的模型,并且通过from exts import db的方式引用db。并且需要注意,因为这里使用的是flask-script的方式进行模型和表的映射,因此不需要使用db.create_all()的方式创建数据库。

    from exts import db
    class User(db.Model): 
        id = db.Column(db.Integer,primary_key=True) 
        username = db.Column(db.String(50)) 
    
        def __init__(self,username): 
            self.username = username
    
  4. manage.py:这个文件用来存放映射数据库的命令,MigrateCommandflask-migrate集成的一个命令,因此想要添加到脚本命令中,需要采用manager.add_command('db',MigrateCommand)的方式,以后运行python manage.py db xxx的命令,其实就是执行MigrateCommand的命令。如果想要让flask-migrate检测到模型,应该把models模块导入到这个文件中。

    from flask_migrate import Migrate,MigrateCommand
    from ext import db
    from flask_script import Manager
    from flask import Flask
    from constants import DB_URI
    import models
    # app = Flask(__name__)
    # 这个 app 可以通过主 app 文件导入
    # 也可以新建一个。建议使用导入的方式,
    # 因为不需要额外的配置了。
    app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    db.init_app(app)
    migrate = Migrate(app,db)
    manager = Manager(app)
    manager.add_command('db',MigrateCommand)
    
    if __name__ == '__main__': 
        manager.run()
    
2832 次点击
所在节点    Flask
2 条回复
loading
2017-03-14 12:38:57 +08:00
flask 网上已经有最佳实践。
KIDJourney
2017-03-14 15:31:42 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/347317

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX