V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
char1998
V2EX  ›  Flask

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

  •  
  •   char1998 · 2017-03-14 11:46:43 +08:00 · 2954 次点击
    这是一个创建于 2812 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在使用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()
      
    2 条回复    2017-03-14 15:31:42 +08:00
    loading
        1
    loading  
       2017-03-14 12:38:57 +08:00 via Android
    flask 网上已经有最佳实践。
    KIDJourney
        2
    KIDJourney  
       2017-03-14 15:31:42 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   877 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:51 · PVG 05:51 · LAX 13:51 · JFK 16:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.