Flask 学习笔记
1.1、简介
Flask-Script 的作用是可以通过命令行的形式来操作 Flask。例如通过命令操作一个开发版本的服务器、设置数据库,定时任务等。要使用 Flask-Script。可以通过 pip install flask-script
安装最新版本。
1.2、命令实现代码的方法
from flask_script import Manager
# 其中 flask_sqlal_demo 是一个py文件(就上一篇写好的), 主要是用到其 app
from flask_sqlal_demo import app
manager = Manager(app)
@manager.command
def hello():
print('hello')
if __name__ == '__main__':
manager.run()
我们把脚本命令代码放在一个名为 manage.py 文件中(名字随便),然后在终端(cmd)运行 python manage.py hello
命令,就可以看到输出 hello 了。
1.3、option 装饰器
如果想要在使用命令的时候还传递参数进去,那么使用 @option
装饰器更加的方便。
# option 装饰器
# '-n', '--name', 一个缩写一个全称(自定义的)
# 参数的 3 个变量名要相同, 否则会报错
@manage.option('-n', '--name', dest='name1')
def hello(name1):
print('Hello ', name1)
if __name__ == '__main__':
manage.run()
终端执行:python manage.py hello --name laowang
或者 python manage.py hello -n laowang
,其中 hello 是方法名。
1.4、添加参数到命令中
@manager.option('-n', '--name', dest='name', default='xxx')
@manager.option('-u', '--url', dest='url', default=None)
def hello(name, url):
if url is None:
print("hello", name)
else:
print("hello", name, "from", url)
@manager.command
def hello(name="xxx")
print("hello", name)
2.1、简介
在实际的开发环境中,经常会发生数据库修改的行为。一般我们修改数据库不会直接手动的去修改,而是去修改 ORM 对应的模型,然后再把模型映射到数据库中。因为手动修改数据库的信息会造成数据库于 ORM 模型的不匹配。
这时候如果有一个工具能专门做这种事情,就显得非常有用了,而 flask-migrate 就是做这个事情的。flask-migrate 是基于 Alembic 进行的一个封装,并集成到 Flask 中,而所有的迁移操作其实都是 Alembic 做的,他能跟踪模型的变化,并将变化映射到数据库中。
使用 pip install flask-migrate
进行安装。
2.2、使用
要让 Flask-Migrate 能够管理 app 中的数据库,需要使用 Migrate(app,db)
来绑定 app 和数据库。
config.py
# MySQL 的配置项
HOSTNAME = '127.0.0.1'
DATABASE = 'demo0427'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'
DB_URL = 'mysql+mysqlconnector://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URL
SQLALCHEMY_TRACK_MODIFICATIONS = False
exts.py
文件中 # 为防止 models.py 与 flask_app.py 文件造成相互引用, 所以在这里定义 db
# models.py 引用 flask_app.py 的 db
# flask_app.py 引用 models.py 的 User
from flask_sqlalchemy import SQLAlchemy
# 这里没有导入 app, 否则又会造成相互引用
db = SQLAlchemy()
models.py
# 这里也要使用 db
from exts import db
class User(db.Model):
__tablename__ = 'pro_users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(70))
email = db.Column(db.String(50))
password = db.Column(db.String(50))
age = db.Column(db.Integer)
flask_app.py
from flask import Flask
import config
from exts import db
app = Flask(__name__)
app.config.from_object(config)
# 向 config 的 db 传入数据
db.init_app(app)
if __name__ == '__main__':
app.run(debug=True)
manage.py
manager.add_command('db',MigrateCommand)
的方式,以后运行 python manage.py db xxx
的命令,其实就是执行 MigrateCommand。 # 通过这个文件 去映射数据库
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from exts import db
from flask_app import app
manage = Manager(app)
Migrate(app, db)
manage.add_command("db", MigrateCommand)
if __name__ == '__main__':
manage.run()
2.3、代码执行
(flask_project-CuO58BhI) $ cd xxx
(flask_project-CuO58BhI) $ python manage.py db init
(flask_project-CuO58BhI) $ python manage.py db migrate
(flask_project-CuO58BhI) $ python manage.py db upgrade