Flask的其他组件介绍


Flask的其他组件介绍


1 flask-script

Flask Script扩展提供 向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任务;使得脚本和系统分开

Flask Script和Flask本身的工作方式类似,只需定义和添加从命令行中被Manager实例调用的命令


创建并运行命令

首先,创建一个Python模板运行命令脚本,可起名为manager.py

可以通过python manage.py查看所有的命令

文件中,必须有一个Manager实例,Manager类追踪所有在命令行中调用的命令和处理过程的调用运行情况

Manager只有一个参数——Flask实例,也可以是一个函数或其他的返回Flask实例

调用manager.run()启动Manager实例接收命令行中的命令

manage.py

	#-*-coding:utf8-*-  
	from flask_script import Manager  
	from debug import app  

	manager = Manager(app)  

	if __name__ == '__main__':  
	    manager.run() 

命令行运行

	python manage.py runserver 启动

	python manage.py shell 进入shell


创建并加入命令

(1)创建Command子类

Command子类必须定义一个run方法;

举例:创建Hello命令,并将Hello命令加入Manager实例;

manage.py

	from flask_script import Manager  
	from flask_script import Command  
	from flask import Flask


	app = Flask(__name__)

	manager = Manager(app)  

	class Hello(Command):  
	    def run(self):  
		print ('hello world')  

	manager.add_command('hello', Hello())  

	if __name__ == '__main__':  
	    manager.run()

命令行  

	python script_flask.py hello
	>> hello world

(2)使用Command子类的装饰器

这样就不用在写run方法,直接在运行的函数上面加上装饰器

manage.py

	from flask_script import Manager  
	from flask import Flask


	app = Flask(__name__)

	manager = Manager(app)  

	@manager.command
	def run():  
	    print ('hello world')  


	if __name__ == '__main__':  
	    manager.run()  

命令行
	python script_flask.py run
	>> hello world

(3)使用Manager实例的@option修饰符

	复杂情况下,建议使用@option

可以有多个@option选项参数;

manage.py

	from flask_script import Manager  
	from flask import Flask

	app = Flask(__name__)

	manager = Manager(app)  

	@manager.option('-n','--name',dest='name',help='your name',default='world')
	@manager.option('-u','--url',dest='url',help='url',default='www.baidu.com')
	def run(name,url):
		print(name,url)  

    这里的dest要与函数的参数一致

	if __name__ == '__main__':  
	    manager.run()  

命令行

	python manage.py run -u(或者- -url) xx.com -n或者- -namemmm
	>> mmm xx.com

2 flask-migrate

在实际的开发环境中,经常会发生 数据库修改 的行为。在models中新加一行或几行column (比如用来保存账户的确认状态)

一般我们修改数据库不会直接手动的去修改,而是去修改ORM对应的模型,然后再把模型映射到数据库中。flask-migrate就是这样的一个工具

flask-migrate是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic做的,他能跟踪模型的变化,并将变化映射到数据库中

安装Flask-Migrate

pip install flask-migrate

导入

使用flask-migrate必须使用flask-scripts这个模块MigrateCommand包中包含了所有和数据库相关的命令

manage.py

	from app import create_app, db  
	from flask_script import Manager, Shell  
	from flask_migrate import Migrate, MigrateCommand  
	app = create_app(os.getenv('FLASK_CONFIG') or 'default')  
	migrate = Migrate(app, db)  
	manager.add_command('db', MigrateCommand) 

使用

三个命令

python manager.py db init 准备迁移环境
python manager.py db migrate 迁移
python manager.py db upgrade 提交

初始化:

	python manage.py db init 

这个命令会在项目下创建 migrations 文件夹,所有迁移脚本都存放其中。

创建第一个版本:

python manage.py db migrate -m "initial migration" 

检查migrations\versions,会新建一个版本.py,检查里面表格及字段

运行升级:

python manage.py db upgrade

会把项目使用的数据库文件,更新为新的表格、字段,同时保留数据

后续更新

  • 更新表格的字段 (models.py)

  • 再次运行一下 db migrate -m -> 相当于commit 更新到/migrate目录

  • db upgrade -> 数据库会更新

Buy me a 肥仔水!