Flask_脚本

1 集成Python shell
在我们实际的开发中,不免有一些任务需要在shell下完成。比如为cms后台添加超级管理员的需求,又比如迁移数据库的需求,定时任务等等,诸如这类需求更适合在shell中去操作(大部分需要在shell中去操作的都是权限比较高的任务)。

提示:迁移数据库就是用来解决数据库更新问题,解决之前我们学的
db.create_all()和db.drop_all()更新数据库的时候丢失数据的问题。
flask官方提供了一个扩展组件flask-script可以实现在shell下操作我们的Flask项目。
1.1 flask-script的用法:
1 由于flask-script是Flask的一个扩展组件,同往常一样首先在虚拟环境中安装我们的flask_script包。
pip install flask-script
1.1.1 实例:flask-script的简单实现
提示:实例下面有讲解
项目目录
│ manage.py
│ server.py
│
├─static # 文件夹
├─templates # 文件夹
server.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
manage.py
from flask_script import Manager
from server import app
manager = Manager(app)
@manager.command
def hello():
print('hello world')
if __name__ == '__main__':
manager.run()
解读:manage.py
(1) 从flask_script模块中导入flask_script的核心类Manager
from flask_script import Manager
(2) 从server.py模块中把app对象导入
from server import app
(3) 从Manager()类传入app对象实例化出manager对象,manager对象用于以后所有添加命令相关操作
manager = Manager(app)
(4)利用@manager.command装饰器添加以被装饰函数的名字命名的一条命令与被装饰函数的映射
@manager.command # 相当于添加了一条hello命令,可以调用到hello函数
def hello():
print('hello world')
(5)manager调用run方法之前定义的命令才会生效
if __name__ == '__main__':
manager.run()
在shell下操作命令
在shell中切入到该manage.py的目录下,并且进入虚拟环境。输入命令python manage.py hello
>>python manage.py hello
命令中的hello是@manager.command装饰器装饰的函数名
执行命令后会调用hello函数
如图所示实现了调用hello函数


1.1.1命令添加方式:
第一种(无参命令):
使用manager.commad方式添加命令:
...
@manager.command
def demo():
print('无参命令')
...
切入到manage.py所在的目录中,切入到虚拟环境,执行如下命令
>>python manage.py demo

第二种(有参命令):
使用manager.option('-简写的命令',‘--全写的命令’,dest=‘传给函数的形参’)添加命令:
...
@manager.option("-u","--username",dest="username")
@manager.option("-p","--password",dest="password")
def login(username, password):
print("用户名:{} 密码: {}".format(username,password))
...
切入到manage.py所在的目录中,切入到虚拟环境,执行如下命令.
>>python manage.py login -u mark -p 123

第三种(子命令):
比如一个功能对应着很多个命令,这个时候就可以用子命令来实现,可以将这些命令的映射单独放到一个文件方便管理。在这个放着很多命令映射的文件中实例化Manager类出一个新的对象,并在manage.py文件中通过manager.add_command("子命令",Manager对象)来添加子命令

实例:
在之前的1.1.1实例的项目目录中新建文件db_script.py
