对flask项目进行简单拆分:
修改成mvc模式:
-
使用 flask-script 拓展将
app.py 文件修改成manager.py -
修改项目结构:
路由管理:
- 直接将视图写到view.py 里面是不会被加载到服务器的;
- 并且相互导入文件但是不能出现循环引用。
要解决的问题是: views需要导入app对象,但是app对象又需要调用到views。
-
故可以将app对象,放到app模块中去实例化:
-
最后将路由注册方法单独的 views文件的函数中。函数需要一个参数app然后在app模块的init文件中,新建一个app对象的时候,将对象带进去这个函数,那么路由就会绑定到这个app对象上面
最后manager文件将这个app对象启动。
也就是app这个对象,是在views.py文件或者说views模块中的 creat_app()函数中 进行实例化,之后也可以采取放到 app模块的init.py文件中去
- 懒加载解决:
缺点,不能够让views里面的结构分文件显示只能在一个文件里面写route
通过参数的形式来传递。 - 代码后附上:
#views.py:
def init_route(app):
@app.route('/')
def hello_world():
return 'Hello World!'
#init:
from flask import Flask
from App.views import init_route
def create_app():
app = Flask(__name__)
init_route(app)
return app
# manager.py
from App import create_app
app = create_app()
manager = Manager(app=app)
文件结构:
路由管理更好的方法-蓝图
-
路由的一种规划,一种设计
-
flask-blueprint
-
bludeprint 使用出现问题。只要在文件里面输出参数 __name__就报错
注意:名字定位错误。。。
结果: pycharm自动导包错误。
应该是:from flask import Blueprint
使用指南: 三种方法,推荐最后一种
-
在views文件中定义一个 Blueprint对象,然后在app生成后注册到app里面。在新的blueprint对象下面写路由。
-
将views作为模块,在init.py文件中去引用其他文件,将其他文件生成的实例全部到init.py中引用:
from .first_blue import blue
依然还是在 app生成之后注册。也就是在APP的init.py文件中注册路由 -
在views 模块中新建init_views()函数,然后注入app对象,在views模块的init.py文件中进行路由的注册。
路由返回模版对象:
使用 return render_template(‘index.html’)方法返回模版对象;
传参数到模版里面:render_template(‘index.html’,msg=‘这是信息’)//key-value传值。
关系型数据库(ORM):
- SQLALchemy //python都能用
- 使用flask-SQLALchemy
- 数据库的uri:
数据库+驱动://用户名:密码@主机:端口/具体哪一个库
- 使用 Sqlite:
- SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。
Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。
连接语句:
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sqlite.db'
注意事项 第一次在pycharm中使用,要记得安装驱动;
进行测试连接:
定义模型类:继承db.Model
SQLAlchemy的对象 db操作数据库的语法:
# 创建:
db.crete_all()
# 删除:
db.drop_all()
#添加
db.session.add()
db.session.commit()
- 换数据库连接:使用mysql
- 例如连接我的mysql:
mysql+mysqlconnector://hhh:Sqlroot123!@xx.xx.xx.xx:3306/hello
pycharm支持自己连接数据库(输入参数即可),可以少可开navicate去查看数据库了。
注意事项
pycharm连接mysql之后,记得选择schema文件。把自己的那个数据库包括进去。不然看不到。
二级变化项目结构:setting.py,ext.py文件;
- 将数据库的配置和初始化放到 ext.py文件中
- 项目设置放到setting.py文件中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BkXYZp1k-1580110984894)(img/flask02/flask02-2020-01-21-02-05-54.png)]
感悟:python只能一个主文件,慢慢去调用其他文件。
在此拆分之后:
之后就可以通过在route里面写业务逻辑然后去调用db对象进行数据库操作。
可以在模型里面 添加sava方法:具体使用过程:
def save(self):
db.session.add(self)
db.session.commit()
终极拆分:
-
适应公司开发,多套环境:
- 开发环境:开发人员使用
- 测试环境:测试人员使用
- 演示环境:给产品看的,做演示,彩排
- 生产环境:线上真实部署。
-
将config 拿到setting.py文件中去:
- 在其中定义基础配置类,开发,测试配置类。get数据库uri方法。
-
然后给app添加config的时候,使用
app.config.from_object(envs.get('develop)')
env 里面的develop变量可以从manager.py 传入
将指定环境放到manage.py
//另外可以通过os.environ.get(‘FLASK_ENV’,‘develop’).实现通过电脑自动获取 环境变量来指定环境
(其实也只是有点点用。。。)
- 如果新建一个表,通过orm映射成表之后,想要添加属性。或者说添加表的字段。 直接create_db 是不能更新表结构的。
- 需要先 drop_db,在create才能更新表结构。
不能动态更新表;
数据库迁移: flask-migrate扩展的使用
懒加载方式,需要db,app对象来进行初始化
migrate = Migrate()
def init_ext(app):
db.init_app(app=app)
# 初始化管理者,需要app
migrate.init_app(app,db)
- 命令行结合 flask-scirpt 使用:
# 初始化
python manager.py db init
# 检查表加表
python manager.py db migrate
# 更新到数据库
python manager.py db upgrade
到此为止 对应java ssh
前端的 route 对应 写接口,应该掉servece
model 也已经定义好了
servece 调用mapper (直接orm完成了)还没搞好。
- 项目结构图:
项目结构:
按照模块拆分:
- user模块里面 有mvc三种文件;
- 每一个模块里面,都有三种文件:mvc v还是用的template
- 可以把某一个模块拎出来放在主目录外面。(我不喜欢分模块写models,和views)