Flask
框架设计模式
所有的代码都是使用
python
语言实现, 在项目开发过程中,将一些 相似的功能 封装在一起, 得到一个半成品的项目, 称为 框架
- django就是 使用 python 语言实现的 , 遵循
MVC
模式的 一个框架, 当然,django中 称为MVT
flask
也是 python实现的 遵循MVC
模式的框架
MVC
:
- M: 模型类,和数据库交互
- V: 视图, 展示给用户看,与用户进行页面交互
- C: 控制器, 负责连接 模型类和视图,实现逻辑处理
MVT
:
- M: 模型类,和数据库交互
- T: 模板, 展示给用户看,与用户进行页面交互
- V: 视图, 负责连接 模型类和视图,实现逻辑处理
开发模式
现在,主流的开发已经不是纯粹的 后端说了算,而是
- 后端 提供接口: 实现 业务的处理以及数据的操作
- 前端 提供页面: 实现 页面的渲染,以及 与用户的交互
只是 将 后端服务,使用 flask实现,前端的页面仍然是 Vue实现
代码构建
Flask 小而精, django 大而全
小项目可以使用 单文件完成, 而 功能庞大的项目不适用单文件,需要对项目结构进行合理划分
项目构造
|--flask01 # 项目目录
|-- app
| |-- __init__.py # 定义工厂函数,导入配置文件和第三方插件,生成 APP,
| |-- settings.py # 项目的配置文件
| |-- extensions.py # flask只提供核心功能,其他功能需要借助 第三方的 插件
|-- manage.py # 负责 管理项目,实现 项目的 启动、模型类的迁移,以及数据表的生成
settings.py
项目的配置文件
class Config(object):
DEBUG = True # 打开调试模式
# mysql://用户名:密码@IP地址:端口号/库名
SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/flask01'
# 是否追踪 mysql 修改的信号量
SQLALCHEMY_TRACK_MODIFICATIONS = False
extensions.py
项目使用的第三方插件
from flask_sqlalchemy import SQLAlchemy # 链接 flask项目和 mysql数据库
from flask_migrate import Migrate # 根据模型类,生成迁移文件,生成表
from flask_cors import CORS # 实现后端跨域
# 有的环境无法安装 mysqlclient,不需要下面的配置
# 使用 pymysql链接数据库,需要多两步配置
import pymysql
pymysql.install_as_MySQLdb()
db = SQLAlchemy() # 链接mysql数据库
migrate = Migrate()
cors = CORS()
def config_extensions(app):
"""为了防止 app没有生成,从而 挂载插件失败,
因此,定义函数,创建app成功,再将app作为参数传入"""
db.init_app(app)
migrate.init_app(app, db=db)
cors.init_app(app)
__init__.py
定义工厂函数,导入配置文件和第三方插件,生成并返回app
from flask import Flask
from .settings import Config
from .extensions import config_extensions
# 工厂函数:通过一个函数,创建一个 flask app
def create_app():
# 1. 创建app
app = Flask(__name__)
# 2. 让app加载配置项
app.config.from_object(Config)
# 3. 挂载第三方插件
config_extensions(app)
return app
manage.py
项目的管理文件
from flask_script import Manager, Server
from flask_migrate import MigrateCommand
from app import create_app
# 1. 利用工厂函数生成app
app = create_app()
# 2. 创建manage对象,管理APP
manage = Manager(app)
# 3.1 自定义 启动服务的命令
manage.add_command('runserver', Server())
# 3.2 自定义 模型类的迁移命令
manage.add_command('db', MigrateCommand)
if __name__ == "__main__":
# 4. 项目启动需要使用manage 对象,而不是 app
manage.run()
项目设计, 可以自定义,但是 建议: 命名见名识义, 结构清晰明了