Flask引入了flask_script包,其中的Manager类用于管理相关操作端命令和使用相关操作端命令,在Manager类相关的源码中有以下这么一段注释举例Manager的典型用法,注释中定义了一个继承了Command的Print类,这个类重写了Command中的run方法,实例化的manager对象使用add_command方法注册实例化了一个Print()类,主函数中manager调用run方法运行,最后Print()中的所有方法被执行了。由此可见,Manager提供了一个Command类,只要继承了这个Command类,使用add_command()方法注册下子类,就可以使用manager的run()方法运行子类中的所有函数。(由于目前flask_script这个包已经被弃用,因此不再分析源码,作为了解即可,感兴趣可下载相应版本查看)
"""
Controller class for handling a set of commands.
Typical usage::
class Print(Command):
def run(self):
print "hello"
app = Flask(__name__)
manager = Manager(app)
manager.add_command("print", Print())
if __name__ == "__main__":
manager.run()
On command line::
python manage.py print
> hello
:param app: Flask instance, or callable returning a Flask instance.
:param with_default_commands: load commands **runserver** and **shell**
by default.
:param disable_argcomplete: disable automatic loading of argcomplete.
"""
使用1:基础应用
步骤一:下载 flask_script 包
pip install flask_script
步骤二:使用里面的 Manager 进行命令得到管理和使用
app = create_app()
# 绑定 app
manager = Manager(app=app)
# 启动
manager.run()
步骤三:在终端使用命令
python app.py runserver
# 或者
python app.py runserver -h 0.0.0.0 -p 5001
使用2:添加自定义命令
步骤一:自定义添加命令
@manager.command
def init():
print('初始化')
步骤二:在终端运行命令
python app.py init
example:
settings.py
class DevelopmentConfig(Config):
ENV = 'development'
class ProductConfig(Config):
ENV = 'product'
apps下的__ init __.py
from flask import Flask
import settings
def create_app():
app = Flask(__name__,template_folder='../templates',static_folder='../static')
app.config.from_object(settings.DevelopmentConfig)
return app
app.py
from apps import create_app
app = create_app()
manager = Manager(app=app)
# ._command[db] = MigrateCommand()
manager.add_command('db',MigrateCommand)
# 自定义添加命令
@manager.command
def init():
print('初始化')
if __name__ == '__main__':
# app.run()
manager.run()
运行结果:
这里介绍ORM这个对象关系映射设计模型,O代表的是object对象,R代表的是Relational关系,M表示的是Mapping映射。ORM框架采用元数据来描述对象与关系映射的细节,可以将具体的模型与数据库中的表进行一一对应,而模型对象的属性对应着数据库表的字段,我们可以通过操作模型及模型对象来实现对数据库表及字段的操作。而Flask本身是没有实现ORM的,因此需要引入一个SQL工具包及对象映射工具的第三方库来实现ORM,Flask-SQLAlchemy就是一种flask数据库操作常引用的第三方库,但使用这个第三方库也存在一个问题,即当需要去修改数据库框架时,表初始化一般都是采用的db.create_all()这个方法,当需要对表进行修改的时候,将要先去数据库中删除该表,才能再重新生成新的表结构的表。为了解决这个问题,这个时候引入了一个第三方库flask-migrate,它可以对数据进行迁移,并且集成到Flask-Script中,所有的迁移操作都是通过命令完成。为了导出数据库迁移命令,Flask-Migrate还提供了一个MigrateCommand类,可以附加到flask-script的manager对象上。
使用:
步骤一:下载相关包
# python 连接数据库 包
pip install pymysql
# 模型对象属性和数据库做映射
pip install flask-sqlalchemy
# 数据库迁移
pip install flask-migrate
步骤二:配置数据库的连接路径
# mysql+pymysql: //user:password@hostip:port/databasename
SQLALCHEMY_DATABASE_URI = 'mysql://root:root@127.0.0.1:3306/'
步骤三:创建一个ext包
# 步骤一:_init__.py中添加
db = SQLAlchemy() ---->必须跟app联系
# 步骤二:apps-->__init__.py中添加
def create_app():
....
db.init_app(app)
return app
# 注:可使用[ python app.py db --help ]查看使用
步骤四:添加迁移命令到manager
app.py中添加:
manager = Manager(app=app)
migrate = Migrate(app=app,db=db)
manager.add_command('db',MigrateCommand)
运行:python app.py db 查看db的使用
步骤五:创建模型;models.py 相当于类
class User(db.Model):
id = db.Column(db.Integer,primary_key = True,autoincrement = True)
username =db.Column(db.String(15),nullable=False)
password = db.Column(db.String(12),nullable=False)
phone = db.Column(db.String(11),nullable=False)
rdatetime = db.Column(db.DateTime,default=datetime.now)
步骤六:使用命令
a.在app.py中导入模型: from apps.user.models import User
b.在终端使用命令:python app.py db init 产生一个migrations文件夹
python app.py db migrate 产生一个版本文件(versions下)
python app.py db upgrade
c.导入相关驱动
DataBase(没有则自己添加插件:file-->setting--->plugins)-->'+'
注:此步骤前记得安装数据库及连接,打开数据库后,运行相关命令
cmd中打开数据库,检查数据库表的生成:
show databases;
use flaskdb01;
show tables;
desc user;
Example:
项目框架
settings.py
class Config:
ENV = 'development'
DEBUG = True
# 连接数据库,格式:mysql+pymysql(驱动): //user:password@hostip:port/databasename
# SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1:3306/'
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1:3306/flaskdb01'
# 如果设置成True(默认情况),Flask-SQLAlchemy将会追踪对象的修改并发送信号,这需要消耗额外的内存
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 调试设置为True
SQLALCHEMY_ECHO = True
class DevelopmentConfig(Config):
ENV = 'development'
class ProductConfig(Config):
ENV = 'product'
ext下的__ init __.py
# 创建一个映射对象
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
db = SQLAlchemy()
apps.user.view.py
from flask import Blueprint, url_for
user_bp = Blueprint('user',__name__)
@user_bp.route('/')
def user_center():
# 反向解析 由函数名找路由
print(url_for('user.register'))
return '用户中心'
@user_bp.route('/register')
def register():
return '用户注册'
apps下的__ init __.py
from flask import Flask
import settings
from apps.user.view import user_bp
from ext import db
def create_app():
app = Flask(__name__,template_folder='../templates',static_folder='../static')
app.config.from_object(settings.DevelopmentConfig)
# 将db与app关联
db.init_app(app)
# 注册一个蓝图
app.register_blueprint(blueprint=user_bp)
return app
app.py
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from apps.user.models import User,UserInfo
from apps import create_app
from ext import db
app = create_app()
manager = Manager(app=app)
# 命令工具
migrate = Migrate(app=app,db=db)
# ._command[db] = MigrateCommand()
manager.add_command('db',MigrateCommand)
# 自定义添加命令
@manager.command
def init():
print('初始化')
if __name__ == '__main__':
# app.run()
manager.run()
models.py
# ORM 类---》 表
# 类对象 ---》 表中的记录
from datetime import datetime
from ext import db
# create table user(id int primary key auto_increment,username varchar(20) not null,....
class User(db.Model):
# db.Column(类型,约束) 映射表中的列
'''
类型:
db.Integer int
db.String varchar(15)
db.DateTime datatime
'''
id = db.Column(db.Integer,primary_key = True,autoincrement = True)
username =db.Column(db.String(15),nullable=False)
passwords = db.Column(db.String(12),nullable=False)
phone = db.Column(db.String(11),nullable=False)
email = db.Column(db.String(20))
rdatetime = db.Column(db.DateTime,default=datetime.now)
def __str__(self):
return self.username
class UserInfo(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
realname = db.Column(db.String(20))
gender = db.Column(db.Boolean,default=False)
def __str__(self):
return self.realname
终端运行db的init命令,将会产生一个migrations文件夹
python app.py db init
终端运行db的migrate命令,将会产生一个版本文件(versions下)
python app.py db migrate
终端运行db的upgrade命令,将会更新数据结构
python app.py db upgrade
补充:
|----apps
|----ext
|----migrations
|----versions 版本文件夹
|----c1ad2ea8b56f_.py --->python app.py migrate 生成版本信息
|----90c023e77fdb_.py
---> python app.py upgrade 升级版本
--->python app.py downgrade 降级版本
项目框架
settings.py
class Config:
Debug = True
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1:3306/flaskdb02'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
class DevelopmentConfig(Config):
ENV = 'development'
Debug = True
class ProductionConfig(Config):
ENV = 'production'
Debug = True
ext下的 __ init __.py
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
# 实例化一个SQLAlchemy对象db
db = SQLAlchemy()
apps下的 __ init __.py
from flask import Flask
import settings
from apps.user.view import user_bp
from exts import db
def create_app():
app = Flask(__name__,template_folder='../templates',static_folder='../static')
app.config.from_object(settings.DevelopmentConfig)
# 初始化配置db
db.init_app(app = app)
# 绑定view中的蓝图
app.register_blueprint(user_bp)
return app
app.py
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from apps.user.models import User
from apps import create_app
from exts import db
app = create_app()
manager = Manager(app = app)
#
migrate = Migrate(app=app,db=db)
# 将数据迁移命令加入._command中
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
models.py
from datetime import datetime
from exts import db
# 创建模型对应数据库中的表和字段
class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(15),nullable=False)
password = db.Column(db.String(12),nullable=False)
phone = db.Column(db.String(11),unique=True)
rdatetime = db.Column(db.DateTime,default=datetime.now())
def __str__(self):
return self.username
view.py
from flask import Blueprint, request, render_template
from apps.user.models import User
from exts import db
user_bp = Blueprint('user',__name__)
@user_bp.route('/register',methods=['GET','POST'])
def register():
if request.method =='POST':
username = request.form.get('username')
password = request.form.get('password')
repassword = request.form.get('repassword')
phone = request.form.get('phone')
if password == repassword:
# 创建对象
user = User()
# 对象赋值
user.username = username
user.password = password
user.phone = phone
# 将对象添加缓存
db.session.add(user)
db.session.commit()
return '用户注册成功!'
return render_template('user/register.html')
终端运行
python app.py db init
python app.py db migrate
python app.py db upgrade
终端运行
python app.py runserver
访问 http://127.0.0.1:5000/register
查看数据库: