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