Flask-Script用来生成shell命令;为在Flask里编写额外的脚本提供了支持。
Flask的开发Web服务器支持很多启动设置选项,但只能在脚本中作为参数传给app.run()函数。
这种方式很不方便,传递设置选项的理想方式是使用命令行参数。
Flask-Scrip就是这么一个Flask扩展,为Flask程序添加一个命令行解析器。
Flask-Script自带了一组常用选项,而且还支持自定义命令。
pip install flask_script
创建一个Python模块运行你的命令脚本。可以任意起名,例如manage.py。
无需把所有的命令都放在同一个文件里,例如,在一个大型项目中,可以把相关联的命令放在不同的文件里。
from flask_script import Manager
app = Flask(__name__)
# Manager类将追踪所有的在命令行中调用的命令和处理过程的调用运行情况;
# configure your app
manager = Manager(app)
if __name__ == "__main__":
# 将启动Manger实例接收命令行中的命令。
manager.run()
(2048) [root@foundation0 day36]# python manage.py
usage: manage.py [-?] {shell,runserver} ...
positional arguments:
{shell,runserver}
shell Runs a Python shell inside Flask application context.
runserver Runs the Flask development server i.e. app.run() # 运行服务器, 可以指定host和端口
1010 python manage.py runserver
1011 python manage.py runserver -h
1012 python manage.py runserver -h '0.0.0.0' -p 8089
optional arguments:
-?, --help show this help message and exit
Extension developers can easily create convenient sub-manager instance within their extensions to make it easy for a user to consume all the available commands of an extension.
Here is an example how a database extension could provide (ex. database.py):
.
├── app
│ ├── forms.py
│ ├── __init__.py
│ ├── models.py
│ ├── __pycache__
│ │ ├── __init__.cpython-36.pyc
│ │ ├── models.cpython-36.pyc
│ │ └── views.cpython-36.pyc
│ ├── static
│ ├── templates
│ │ └── list.html
│ └── views.py
├── manage.py
├──config.py
将新建一个manage.py文件,
在之前的(上一篇文章)init.py文件中新实例化manager对象,
init.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
import pymysql
from flask_script import Manager
from flask_migrate import Migrate
pymysql.install_as_MySQLdb()
app = Flask(__name__)
app.config.from_pyfile('../config.py')
db = SQLAlchemy(app)
bt = Bootstrap(app)
manager = Manager(app)
新建一个manage.py
from flask_migrate import MigrateCommand
from app import manager
from app.views import *
if __name__ == '__main__':
# app.run(port=5006)
manager.run()
终端运行:
两个命令:
python manage.py runserver 运行app这个flask
python manage.py shell 打开shell
这两个命令不够我们操作数据库,那么怎么办呢?
1.类的继承
from flask_migrate import MigrateCommand
from flask_script import Command
from app import manager, db
from app.views import *
class AddUser(Command):
"""添加用户"""
def run(self):
u=User(username='fentiao11111',password='fentiao',email='[email protected]')
db.session.add(u)
db.session.commit()
return '正在添加用户%s' %(u.username)
# 添加类到命令中,让manage进行管理
manager.add_command('adduser',AddUser)
if __name__ == '__main__':
# app.run(port=5006)
manager.run()
from flask_script import Command
from app import manager, db
from app.views import *
# 类的继承
class AddUser(Command):
"""添加用户"""
def run(self):
u=User(username='fentiao11111',password='fentiao',email='[email protected]')
db.session.add(u)
db.session.commit()
return '正在添加用户%s' %(u.username)
# 2 通过装饰器manager.command
@manager.command
def deleteUser():
"""删除用户"""
u = User.query.filter_by(username='fentiao11111').first()
if u:
db.session.delete(u)
db.session.commit()
return '删除用户%s成功' %(u.username)
else:
return '删除用户失败'
# 添加类到命令中,让manage进行管理
manager.add_command('adduser',AddUser)
if __name__ == '__main__':
# app.run(port=5006)
manager.run()
@database_manager.option('-u', '--username', help="指定用户名")
@database_manager.option('-p', '--password', help="指定密码")
def add_user(username, password):
"""添加用户, 指定用户名和密码"""
if username and password:
u = User(username=username, password=password)
db.session.add(u)
db.session.commit()
return "添加用户%s成功" %(u.username)
else:
return "请指定用户名和密码"
数据库不止这三个命令,我们增加多个命令整合放在database命令里,新建一个managerUtil目录在app目录下,新建一个database.py文件存放数据库命令的相关操作。
database.py
from flask_script import Manager, prompt_bool, Command
from app import db
from app.models import User, Role
database_manager = Manager(usage="数据库的操作详情")
# 1. 方法一: 类的继承
class AddUser(Command):
"""添加用户"""
def run(self):
u = User(username="fentiao90009", password="fentiao", email="[email protected]")
db.session.add(u)
db.session.commit()
return "正在添加用户%s........" % (u.username)
# 添加类到命令中, 让manger进行管理
database_manager.add_command('adduser', AddUser)
# 2. 通过装饰器@database_manager.command
@database_manager.command
def deleteUser():
"""删除用户"""
u = User.query.filter_by(username='fentiao90009').first()
if u:
db.session.delete(u)
db.session.commit()
return "删除用户%s成功....." % (u.username)
else:
return "删除用户失败:"
# 3). option装饰器, 可以指定参数
@database_manager.option('-u', '--username', help="指定用户名")
@database_manager.option('-p', '--password', help="指定密码")
def add_user(username, password):
"""添加用户, 指定用户名和密码"""
if username and password:
u = User(username=username, password=password)
db.session.add(u)
db.session.commit()
return "添加用户%s成功" %(u.username)
else:
return "请指定用户名和密码"
@database_manager.command
def dropdb():
"""删除数据库"""
if prompt_bool("是否删除数据库"):
db.drop_all()
@database_manager.command
def createdb():
"""创建数据库"""
if prompt_bool("是否创建数据库"):
db.create_all()
@database_manager.command
def recreate():
"""重建数据库"""
if prompt_bool("是否重数据库"):
dropdb()
createdb()
manage.py
只留下database的创建
from flask_script import Command
from app import manager, db
from app.manageUtil.database import database_manager
from app.views import *
# 添加类到命令中,让manage进行管理
manager.add_command('database',database_manager)
if __name__ == '__main__':
# app.run(port=5006)
manager.run()
加一个初始化的功能:
from flask_script import Manager, prompt_bool, Command
from app import db
from app.models import User, Role
database_manager = Manager(usage="数据库的操作详情")
# 1. 方法一: 类的继承
class AddUser(Command):
"""添加用户"""
def run(self):
u = User(username="fentiao90009", password="fentiao", email="[email protected]")
db.session.add(u)
db.session.commit()
return "正在添加用户%s........" % (u.username)
# 添加类到命令中, 让manger进行管理
database_manager.add_command('adduser', AddUser)
# 2. 通过装饰器@database_manager.command
@database_manager.command
def deleteUser():
"""删除用户"""
u = User.query.filter_by(username='fentiao90009').first()
if u:
db.session.delete(u)
db.session.commit()
return "删除用户%s成功....." % (u.username)
else:
return "删除用户失败:"
# 3). option装饰器, 可以指定参数
@database_manager.option('-u', '--username', help="指定用户名")
@database_manager.option('-p', '--password', help="指定密码")
def add_user(username, password):
"""添加用户, 指定用户名和密码"""
if username and password:
u = User(username=username, password=password)
db.session.add(u)
db.session.commit()
return "添加用户%s成功" %(u.username)
else:
return "请指定用户名和密码"
@database_manager.command
def dropdb():
"""删除数据库"""
if prompt_bool("是否删除数据库"):
db.drop_all()
@database_manager.command
def createdb():
"""创建数据库"""
if prompt_bool("是否创建数据库"):
db.create_all()
@database_manager.command
def recreate():
"""重建数据库"""
if prompt_bool("是否重数据库"):
dropdb()
createdb()
@database_manager.command
def init_data():
"""初始化数据库"""
role = Role(name="管理员")
db.session.add(role)
for user in range(100):
u = User(username="westos%s" %(user), password="hello", email="westos%[email protected]" %(user))
db.session.add(u)
db.session.commit()
print("初始化完成")