Flask-Script 介绍
Flask-Script 的作用是可以通过命令行的形式来操作 Flask,例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等
要使用 Flask-Script,可以通过如下命令安装最新版本
pip install flask-script
首先,下列是一个创建二个表的 Python 文件(my_web.py)(利用了 SQLAlchemy 插件)
from flask import Flask # 用于 Flask 实例化
from flask_sqlalchemy import SQLAlchemy # 用于浏览器和数据库的关联(SQLAlchemy 插件)
HOSTNAME = '127.0.0.1' # 地址
DATABASE = 'mysql_1' # 数据库
PORT = 3306 # 端口
USERNAME = 'root' # 用户名
PASSWORD = 'root' # 密码
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) # 创建 url
web = Flask(__name__) # 实例化 Flask 对象
# 映射数据库, 数据库和浏览器关联, SQLAlchemy 插件语法
web.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
web.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(web)
@web.route('/') # 关联视图函数
def index(): # 视图函数
return '首页' # 浏览器显示文本
# 插件表格继承于类 db.Model, SQLAlchemy 插件语法
class User(db.Model):
# 给表格取名字, 若缺失此参数, 那么表格的名字将以类的名字代替
__tablename__ = 'users'
# 创建字段 id, 数据类型约束 int, 主键, 自增长
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
# 创建字段 name, 数据类型约束 String
name = db.Column(db.String(50))
def __repr__(self):
return '<User:id:{},name:{}>'.format(self.id, self.name)
# 插件表格继承于类 db.Model, SQLAlchemy 插件语法
class Article(db.Model):
# 给表格取名字, 若缺失此参数, 那么表格的名字将以类的名字代替
__tablename__ = 'articles'
# 创建字段 id, 数据类型约束 int, 主键, 自增长
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
# 创建字段 title, 数据类型约束 String
title = db.Column(db.String(50))
# 创建字段 uid, 数据类型约束 int, 设置为表 users 字段 id 的外键
uid = db.Column(db.Integer, db.ForeignKey('users.id'))
# 创建表关联
author = db.relationship('User', backref='articles')
# 映射表格到数据库
db.create_all()
if __name__ == '__main__':
web.run(debug=True)
然后,创建另一个利用 Script 库的 Python 文件(manage.py)
from flask_script import Manager # 导入 Manager
from my_web import web # 从 my_web 文件中导入 web 实例
manage = Manager(web) # 实例化 Manager
# @option('-n', '--name', dest='name')
# @option('-u', '--url', dest='url')
@manage.option('-n', '--name', dest='name') # dest 为描述
@manage.option('-u', '--url', dest='url') # dest 为描述
def index(name, url):
print('hello', name, url)
if __name__ == '__main__':
manage.run() # 运行实例
最后,我们在命令行中运行 manage.py 文件
python manage.py index -u=... -n=...
# python manage 文件里面的 index 视图函数
# 其中 -u 和 -n 指定参数
Flask-Script 应用
先创建表格 users
from flask import Flask # 用于 Flask 实例化
from flask_sqlalchemy import SQLAlchemy # 用于浏览器和数据库的关联(SQLAlchemy 插件)
HOSTNAME = '127.0.0.1' # 地址
DATABASE = 'mysql_1' # 数据库
PORT = 3306 # 端口
USERNAME = 'root' # 用户名
PASSWORD = 'root' # 密码
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) # 创建 url
web = Flask(__name__) # 实例化 Flask 对象
# 映射数据库, 数据库和浏览器关联, SQLAlchemy 插件语法
web.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
web.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(web)
@web.route('/') # 关联视图函数
def index(): # 视图函数
return '首页' # 浏览器显示文本
# 插件表格继承于类 db.Model, SQLAlchemy 插件语法
class User(db.Model):
# 给表格取名字, 若缺失此参数, 那么表格的名字将以类的名字代替
__tablename__ = 'users'
# 创建字段 id, 数据类型约束 int, 主键, 自增长
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
# 创建字段 name, 数据类型约束 String
name = db.Column(db.String(50))
def __repr__(self):
return '<User:id:{},name:{}>'.format(self.id, self.name)
# 映射表格到数据库
db.create_all()
if __name__ == '__main__':
web.run(debug=True)
manage.py 文件
from flask_script import Manager
from my_web import web, User, db
manage = Manager(web)
# @option('-n', '--name', dest='name')
# @option('-u', '--url', dest='url')
@manage.option('-n', '--username', dest='username')
def add_user(username):
user = User(name=username)
db.session.add(user)
db.session.commit()
if __name__ == '__main__':
manage.run()
然后控制台执行如下命令后,向表 users 增添了二条数据
python manage.py add_user -n=susu
python manage.py add_user -n=keke
Flask-Migrate
在实际的开发环境中,经常会发生数据库修改的行为,一般我们修改数据库不会直接手动的去修改,而是去修改 ORM 对应的模型,然后再把模型映射到数据库中,这时候如果有一个工具能专门做这种事情,就显得非常有用了,而 flask-migrate 就是做这个事情的
flask-migrate 是基于 Alembic 进行的一个封装,并集成到 Flask 中,而所有的迁移操作其实都是 Alembic 做的,它能跟踪模型的变化,并将变化映射到数据库中
同样的,flask-migrate 需要安装,安装命令如下
特别注意:flask_ migrate 版本
pip install flask-migrate==2.7.0
Python 文件(manage.py)
控制台操作此文件,具体操作为创建迁移仓库 python manage.py db init
会生成一个迁移文件夹 migrations,所有的迁移文件存放的位置,创建迁移脚本 python manage.py db migrate
,更新数据库 python manage.py db upgrade
(此时数据库中生成表格)
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from exts import db
# 以上为三个插件
from web_1 import web # 导入 web 实例
from models import User, Address
manage = Manager(web)
Migrate(web, db)
manage.add_command('db', MigrateCommand)
if __name__ == '__main__':
manage.run()
Python 文件(models.py)
此处为数据库提供表格
from exts import db
# 创建二个表格, user , address
class User(db.Model): # 表格 user
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20))
addresses = db.relationship('Address',backref='user')
class Address(db.Model): # 表格 address
id = db.Column(db.Integer, primary_key=True)
email_address = db.Column(db.String(50))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
Python 文件(web_1.py)
用于和浏览器作出关联
from flask import Flask # 用于实例化 Flask 对象
# 用于绑定 Flask 对象, 继承父类, 实例化对象, 判断 url
import config
from exts import db
# from models import
web = Flask(__name__) # 实例化 Flask 对象
web.config.from_object(config) # 绑定配置文件
db.init_app(web) # 绑定 app
if __name__ == '__main__':
web.run(debug=True, port=7500)
Python 文件(exts.py)
中间文件
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
Python 文件(config.py)
配置项文件
HOSTNAME = '127.0.0.1' # 地址
DATABASE = 'mysql_3' # 数据库
PORT = 3306 # 端口
USERNAME = 'root' # 用户名
PASSWORD = 'root' # 密码
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) # 创建 url
SQLALCHEMY_DATABASE_URI = DB_URL
SQLALCHEMY_TRACK_MODIFICATIONS = False
数据库表格创建结果