好的MVC目录结构

编排flask目录 - 图1

这里,把之前学习的代码都删一删,保留干净的目录结构。

MVC优化

flask_script自定义启动命令
把启动服务和其他操作剥离开来

需要先安装flask_script
pip install flask_script
在application文件:

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. from flask_script import Manager
  4. app = Flask(__name__)
  5. manager = Manager(app)
  6. app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://juha:123@39.106.206.96/mysql"
  7. app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True
  8. db = SQLAlchemy(app)

然后,在run.py文件:

  1. from application import app,db,manager
  2. from register import *
  3. from flask_script import Server
  4. @app.route('/')
  5. def hello():
  6. return "hello, home page"
  7. #web server
  8. manager.add_command("runserver",Server(host = '0.0.0.0',use_debugger = True,use_reloader = True))
  9. if __name__ == '__main__':
  10. # app.run(debug=True,host='0.0.0.0')
  11. manager.run()

此时,执行run.py并不会开启5000端口,而是需要执行python run.py runserver
这里的runserver,就是manager.add_command后面的那个runserver。

下面这波操作就不太能看懂了:

  1. from application import app,manager
  2. from register import *
  3. from flask_script import Server,Command
  4. @app.route('/')
  5. def hello():
  6. return "hello, home page"
  7. #web server
  8. manager.add_command("runserver",Server(host = '0.0.0.0',use_debugger = True,use_reloader = True))
  9. @Command
  10. def create_all():
  11. # 这里把db弄到下面来导入了
  12. from application import db
  13. from common.models.user import User
  14. db.create_all()
  15. manager.add_command("create_all",create_all)
  16. if __name__ == '__main__':
  17. # app.run(debug=True,host='0.0.0.0')
  18. manager.run()

编排flask目录 - 图2

于是执行了python run.py create_all
执行结果:

  1. H:\new_to_flask>python run.py create_all
  2. C:\ProgramData\Anaconda3\lib\site-packages\pymysql\cursors.py:170: Warning: (1287, "'@@tx_isolation' is deprecated and will be removed in a future release. Please use '@@transaction_isolation' instead")
  3. result = self._query(query)

去数据库看一眼,发现确实创建成功了,因为这里的User是从mysql的user表自动化导出的,然后sqlconfig那里,把后面的表从mysql改为了新建的一个库mytest
编排flask目录 - 图3

然后后面又搞了这个操作,也是在run.py下面:

  1. def main():
  2. manager.run()
  3. if __name__ == '__main__':
  4. # app.run(debug=True,host='0.0.0.0')
  5. # manager.run()
  6. try:
  7. import sys
  8. sys.exit(main())
  9. except Exception as e:
  10. import traceback
  11. traceback.print_exc()

此时执行python run.py runserver和上面的没啥区别

多环境配置文件

开始使用配置文件了。
这里是在config文件夹下配置了三个文件:
base_setting.py、product_setting.py和loca_setting.py
然后巧妙地使用环境变量名的方法引入不同的配置文件:
application.py

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. from flask_script import Manager
  4. import os
  5. app = Flask(__name__)
  6. manager = Manager(app)
  7. #这里的base_setting是通用的配置文件
  8. app.config.from_pyfile('config/base_setting.py')
  9. #这里实际上是玩了一个花招,利用环境变量ops_config的值来定义当前环境使用哪个文件名的配置
  10. if "ops_config" in os.environ:
  11. app.config.from_pyfile('config/%s_setting.py'%(os.environ['ops_config']))
  12. db = SQLAlchemy(app)
  13. print(os.environ)

在base_setting.py中:

  1. #通用配置
  2. DEBUG = True
  3. SQLALCHEMY_DATABASE_URI = "mysql+pymysql://juha:123@39.106.206.96/mytest"
  4. SQLALCHEMY_TRACK_MODIFICATIONS=True
  5. #是否把相应的sql语句打印出来
  6. SQLALCHEMY_ECHO = True
  7. SQLALCHEMY_ENCODING = 'utf8mb64'

其他的两个配置文件,引入以防覆盖:

  1. from base_setting import *
  2. #下面自由发挥

会出现如下错误的可能性是因为把一个字符串赋值给了一个字符串,而不是变量,我是因为在配置文件中把变量名加了双引号导致的

  1. SyntaxError: can't assign to literal

windows配置这个环境变量使用:
set ops_config = local或
set ops_config = product

Linux则是export ops_config= local|product