好的MVC目录结构
这里,把之前学习的代码都删一删,保留干净的目录结构。
MVC优化
flask_script自定义启动命令
把启动服务和其他操作剥离开来
需要先安装flask_scriptpip install flask_script
在application文件:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
app = Flask(__name__)
manager = Manager(app)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://juha:123@39.106.206.96/mysql"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=True
db = SQLAlchemy(app)
然后,在run.py文件:
from application import app,db,manager
from register import *
from flask_script import Server
@app.route('/')
def hello():
return "hello, home page"
#web server
manager.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,manager
from register import *
from flask_script import Server,Command
@app.route('/')
def hello():
return "hello, home page"
#web server
manager.add_command("runserver",Server(host = '0.0.0.0',use_debugger = True,use_reloader = True))
@Command
def create_all():
# 这里把db弄到下面来导入了
from application import db
from common.models.user import User
db.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_all
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")
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 sys
sys.exit(main())
except Exception as e:
import traceback
traceback.print_exc()
此时执行python run.py runserver和上面的没啥区别
多环境配置文件
开始使用配置文件了。
这里是在config文件夹下配置了三个文件:
base_setting.py、product_setting.py和loca_setting.py
然后巧妙地使用环境变量名的方法引入不同的配置文件:
application.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
import os
app = 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 = True
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://juha:123@39.106.206.96/mytest"
SQLALCHEMY_TRACK_MODIFICATIONS=True
#是否把相应的sql语句打印出来
SQLALCHEMY_ECHO = True
SQLALCHEMY_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