好的MVC目录结构

这里,把之前学习的代码都删一删,保留干净的目录结构。
MVC优化
flask_script自定义启动命令
把启动服务和其他操作剥离开来
需要先安装flask_scriptpip install flask_script
在application文件:
from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyfrom flask_script import Managerapp = Flask(__name__)manager = Manager(app)app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://juha:123@39.106.206.96/mysql"app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=Truedb = SQLAlchemy(app)
然后,在run.py文件:
from application import app,db,managerfrom register import *from flask_script import Server@app.route('/')def hello():return "hello, home page"#web servermanager.add_command("runserver",Server(host = '0.0.0.0',use_debugger = True,use_reloader = True))if __name__ == '__main__':# app.run(debug=True,host='0.0.0.0')manager.run()
此时,执行run.py并不会开启5000端口,而是需要执行python run.py runserver
这里的runserver,就是manager.add_command后面的那个runserver。
下面这波操作就不太能看懂了:
from application import app,managerfrom register import *from flask_script import Server,Command@app.route('/')def hello():return "hello, home page"#web servermanager.add_command("runserver",Server(host = '0.0.0.0',use_debugger = True,use_reloader = True))@Commanddef create_all():# 这里把db弄到下面来导入了from application import dbfrom common.models.user import Userdb.create_all()manager.add_command("create_all",create_all)if __name__ == '__main__':# app.run(debug=True,host='0.0.0.0')manager.run()

于是执行了python run.py create_all
执行结果:
H:\new_to_flask>python run.py create_allC:\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")result = self._query(query)
去数据库看一眼,发现确实创建成功了,因为这里的User是从mysql的user表自动化导出的,然后sqlconfig那里,把后面的表从mysql改为了新建的一个库mytest
然后后面又搞了这个操作,也是在run.py下面:
def main():manager.run()if __name__ == '__main__':# app.run(debug=True,host='0.0.0.0')# manager.run()try:import syssys.exit(main())except Exception as e:import tracebacktraceback.print_exc()
此时执行python run.py runserver和上面的没啥区别
多环境配置文件
开始使用配置文件了。
这里是在config文件夹下配置了三个文件:
base_setting.py、product_setting.py和loca_setting.py
然后巧妙地使用环境变量名的方法引入不同的配置文件:
application.py
from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyfrom flask_script import Managerimport osapp = Flask(__name__)manager = Manager(app)#这里的base_setting是通用的配置文件app.config.from_pyfile('config/base_setting.py')#这里实际上是玩了一个花招,利用环境变量ops_config的值来定义当前环境使用哪个文件名的配置if "ops_config" in os.environ:app.config.from_pyfile('config/%s_setting.py'%(os.environ['ops_config']))db = SQLAlchemy(app)print(os.environ)
在base_setting.py中:
#通用配置DEBUG = TrueSQLALCHEMY_DATABASE_URI = "mysql+pymysql://juha:123@39.106.206.96/mytest"SQLALCHEMY_TRACK_MODIFICATIONS=True#是否把相应的sql语句打印出来SQLALCHEMY_ECHO = TrueSQLALCHEMY_ENCODING = 'utf8mb64'
其他的两个配置文件,引入以防覆盖:
from base_setting import *#下面自由发挥
会出现如下错误的可能性是因为把一个字符串赋值给了一个字符串,而不是变量,我是因为在配置文件中把变量名加了双引号导致的
SyntaxError: can't assign to literal
windows配置这个环境变量使用:
set ops_config = local或
set ops_config = product
Linux则是export ops_config= local|product
