当前位置:网站首页>Flask框架初学-05-命令管理Manager及数据库的使用
Flask框架初学-05-命令管理Manager及数据库的使用
2022-08-04 01:30:00 【流墨馨】
一、Manager使用
Flask引入了flask_script包,其中的Manager类用于管理相关操作端命令和使用相关操作端命令,在Manager类相关的源码中有以下这么一段注释举例Manager的典型用法,注释中定义了一个继承了Command的Print类,这个类重写了Command中的run方法,实例化的manager对象使用add_command方法注册实例化了一个Print()类,主函数中manager调用run方法运行,最后Print()中的所有方法被执行了。由此可见,Manager提供了一个Command类,只要继承了这个Command类,使用add_command()方法注册下子类,就可以使用manager的run()方法运行子类中的所有函数。(由于目前flask_script这个包已经被弃用,因此不再分析源码,作为了解即可,感兴趣可下载相应版本查看)
""" Controller class for handling a set of commands. Typical usage:: class Print(Command): def run(self): print "hello" app = Flask(__name__) manager = Manager(app) manager.add_command("print", Print()) if __name__ == "__main__": manager.run() On command line:: python manage.py print > hello :param app: Flask instance, or callable returning a Flask instance. :param with_default_commands: load commands **runserver** and **shell** by default. :param disable_argcomplete: disable automatic loading of argcomplete. """
使用1:基础应用
步骤一:下载 flask_script 包
pip install flask_script
步骤二:使用里面的 Manager 进行命令得到管理和使用
app = create_app()
# 绑定 app
manager = Manager(app=app)
# 启动
manager.run()
步骤三:在终端使用命令
python app.py runserver
# 或者
python app.py runserver -h 0.0.0.0 -p 5001
使用2:添加自定义命令
步骤一:自定义添加命令
@manager.command
def init():
print('初始化')
步骤二:在终端运行命令
python app.py init
example:
settings.py
class DevelopmentConfig(Config):
ENV = 'development'
class ProductConfig(Config):
ENV = 'product'
apps下的__ init __.py
from flask import Flask
import settings
def create_app():
app = Flask(__name__,template_folder='../templates',static_folder='../static')
app.config.from_object(settings.DevelopmentConfig)
return app
app.py
from apps import create_app
app = create_app()
manager = Manager(app=app)
# ._command[db] = MigrateCommand()
manager.add_command('db',MigrateCommand)
# 自定义添加命令
@manager.command
def init():
print('初始化')
if __name__ == '__main__':
# app.run()
manager.run()
运行结果:
二、数据库的使用
这里介绍ORM这个对象关系映射设计模型,O代表的是object对象,R代表的是Relational关系,M表示的是Mapping映射。ORM框架采用元数据来描述对象与关系映射的细节,可以将具体的模型与数据库中的表进行一一对应,而模型对象的属性对应着数据库表的字段,我们可以通过操作模型及模型对象来实现对数据库表及字段的操作。而Flask本身是没有实现ORM的,因此需要引入一个SQL工具包及对象映射工具的第三方库来实现ORM,Flask-SQLAlchemy就是一种flask数据库操作常引用的第三方库,但使用这个第三方库也存在一个问题,即当需要去修改数据库框架时,表初始化一般都是采用的db.create_all()这个方法,当需要对表进行修改的时候,将要先去数据库中删除该表,才能再重新生成新的表结构的表。为了解决这个问题,这个时候引入了一个第三方库flask-migrate,它可以对数据进行迁移,并且集成到Flask-Script中,所有的迁移操作都是通过命令完成。为了导出数据库迁移命令,Flask-Migrate还提供了一个MigrateCommand类,可以附加到flask-script的manager对象上。
使用:
步骤一:下载相关包
# python 连接数据库 包
pip install pymysql
# 模型对象属性和数据库做映射
pip install flask-sqlalchemy
# 数据库迁移
pip install flask-migrate
步骤二:配置数据库的连接路径
# mysql+pymysql: //user:[email protected]:port/databasename
SQLALCHEMY_DATABASE_URI = 'mysql://root:[email protected]:3306/'
步骤三:创建一个ext包
# 步骤一:_init__.py中添加
db = SQLAlchemy() ---->必须跟app联系
# 步骤二:apps-->__init__.py中添加
def create_app():
....
db.init_app(app)
return app
# 注:可使用[ python app.py db --help ]查看使用
步骤四:添加迁移命令到manager
app.py中添加:
manager = Manager(app=app)
migrate = Migrate(app=app,db=db)
manager.add_command('db',MigrateCommand)
运行:python app.py db 查看db的使用
步骤五:创建模型;models.py 相当于类
class User(db.Model):
id = db.Column(db.Integer,primary_key = True,autoincrement = True)
username =db.Column(db.String(15),nullable=False)
password = db.Column(db.String(12),nullable=False)
phone = db.Column(db.String(11),nullable=False)
rdatetime = db.Column(db.DateTime,default=datetime.now)
步骤六:使用命令
a.在app.py中导入模型: from apps.user.models import User
b.在终端使用命令:python app.py db init 产生一个migrations文件夹
python app.py db migrate 产生一个版本文件(versions下)
python app.py db upgrade
c.导入相关驱动
DataBase(没有则自己添加插件:file-->setting--->plugins)-->'+'
注:此步骤前记得安装数据库及连接,打开数据库后,运行相关命令
cmd中打开数据库,检查数据库表的生成:
show databases;
use flaskdb01;
show tables;
desc user;
Example:
项目框架
settings.py
class Config:
ENV = 'development'
DEBUG = True
# 连接数据库,格式:mysql+pymysql(驱动): //user:[email protected]:port/databasename
# SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/'
SQLALCHEMY_DATABASE_URI = 'mysql://root:[email protected]:3306/flaskdb01'
# 如果设置成True(默认情况),Flask-SQLAlchemy将会追踪对象的修改并发送信号,这需要消耗额外的内存
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 调试设置为True
SQLALCHEMY_ECHO = True
class DevelopmentConfig(Config):
ENV = 'development'
class ProductConfig(Config):
ENV = 'product'
ext下的__ init __.py
# 创建一个映射对象
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
db = SQLAlchemy()
apps.user.view.py
from flask import Blueprint, url_for
user_bp = Blueprint('user',__name__)
@user_bp.route('/')
def user_center():
# 反向解析 由函数名找路由
print(url_for('user.register'))
return '用户中心'
@user_bp.route('/register')
def register():
return '用户注册'
apps下的__ init __.py
from flask import Flask
import settings
from apps.user.view import user_bp
from ext import db
def create_app():
app = Flask(__name__,template_folder='../templates',static_folder='../static')
app.config.from_object(settings.DevelopmentConfig)
# 将db与app关联
db.init_app(app)
# 注册一个蓝图
app.register_blueprint(blueprint=user_bp)
return app
app.py
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from apps.user.models import User,UserInfo
from apps import create_app
from ext import db
app = create_app()
manager = Manager(app=app)
# 命令工具
migrate = Migrate(app=app,db=db)
# ._command[db] = MigrateCommand()
manager.add_command('db',MigrateCommand)
# 自定义添加命令
@manager.command
def init():
print('初始化')
if __name__ == '__main__':
# app.run()
manager.run()
models.py
# ORM 类---》 表
# 类对象 ---》 表中的记录
from datetime import datetime
from ext import db
# create table user(id int primary key auto_increment,username varchar(20) not null,....
class User(db.Model):
# db.Column(类型,约束) 映射表中的列
''' 类型: db.Integer int db.String varchar(15) db.DateTime datatime '''
id = db.Column(db.Integer,primary_key = True,autoincrement = True)
username =db.Column(db.String(15),nullable=False)
passwords = db.Column(db.String(12),nullable=False)
phone = db.Column(db.String(11),nullable=False)
email = db.Column(db.String(20))
rdatetime = db.Column(db.DateTime,default=datetime.now)
def __str__(self):
return self.username
class UserInfo(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
realname = db.Column(db.String(20))
gender = db.Column(db.Boolean,default=False)
def __str__(self):
return self.realname
终端运行db的init命令,将会产生一个migrations文件夹
python app.py db init
终端运行db的migrate命令,将会产生一个版本文件(versions下)
python app.py db migrate
终端运行db的upgrade命令,将会更新数据结构
python app.py db upgrade
补充:
|----apps
|----ext
|----migrations
|----versions 版本文件夹
|----c1ad2ea8b56f_.py --->python app.py migrate 生成版本信息
|----90c023e77fdb_.py
---> python app.py upgrade 升级版本
--->python app.py downgrade 降级版本
三、简单应用
项目框架
settings.py
class Config:
Debug = True
SQLALCHEMY_DATABASE_URI = 'mysql://root:[email protected]:3306/flaskdb02'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
class DevelopmentConfig(Config):
ENV = 'development'
Debug = True
class ProductionConfig(Config):
ENV = 'production'
Debug = True
ext下的 __ init __.py
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
# 实例化一个SQLAlchemy对象db
db = SQLAlchemy()
apps下的 __ init __.py
from flask import Flask
import settings
from apps.user.view import user_bp
from exts import db
def create_app():
app = Flask(__name__,template_folder='../templates',static_folder='../static')
app.config.from_object(settings.DevelopmentConfig)
# 初始化配置db
db.init_app(app = app)
# 绑定view中的蓝图
app.register_blueprint(user_bp)
return app
app.py
from flask_migrate import Migrate,MigrateCommand
from flask_script import Manager
from apps.user.models import User
from apps import create_app
from exts import db
app = create_app()
manager = Manager(app = app)
#
migrate = Migrate(app=app,db=db)
# 将数据迁移命令加入._command中
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
models.py
from datetime import datetime
from exts import db
# 创建模型对应数据库中的表和字段
class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(15),nullable=False)
password = db.Column(db.String(12),nullable=False)
phone = db.Column(db.String(11),unique=True)
rdatetime = db.Column(db.DateTime,default=datetime.now())
def __str__(self):
return self.username
view.py
from flask import Blueprint, request, render_template
from apps.user.models import User
from exts import db
user_bp = Blueprint('user',__name__)
@user_bp.route('/register',methods=['GET','POST'])
def register():
if request.method =='POST':
username = request.form.get('username')
password = request.form.get('password')
repassword = request.form.get('repassword')
phone = request.form.get('phone')
if password == repassword:
# 创建对象
user = User()
# 对象赋值
user.username = username
user.password = password
user.phone = phone
# 将对象添加缓存
db.session.add(user)
db.session.commit()
return '用户注册成功!'
return render_template('user/register.html')
终端运行
python app.py db init
python app.py db migrate
python app.py db upgrade
终端运行
python app.py runserver
访问 http://127.0.0.1:5000/register
查看数据库:
边栏推荐
- 可变字符串
- WMS仓储管理系统能解决电子行业哪些仓库管理问题
- 多渠道打包
- nodejs+express realizes the access to the database mysql and displays the data on the page
- 如何通过单步调试的方式找到引起 Fiori Launchpad 路由错误的原因试读版
- Android interview questions and answer analysis of major factories in the first half of 2022 (continuously updated...)
- Thinkphp commonly used techniques
- LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化
- Web3 安全风险令人生畏?应该如何应对?
- typescript51-泛型的基本使用
猜你喜欢
随机推荐
nodejs+npm的安装与配置
虚拟机CentOS7中无图形界面安装Oracle
在Activity中获取另一个XML文件的控件
计算首屏时间
nodejs 安装多版本 版本切换
Demand analysis of MES management system in electronic assembly industry
this巩固训练,从两道执行题加深理解闭包与箭头函数中的this
2022 中国算力大会发布“创新先锋”优秀成果
观察者模式
ThreadLocal
网络带宽监控,带宽监控工具哪个好
Is there any jdbc link to Youxuan database documentation and examples?
特征值与特征向量
C 学生管理系统_分析
多渠道打包
Analysis of usage scenarios of mutex, read-write lock, spin lock, and atomic operation instructions xaddl and cmpxchg
pygame 中的transform模块
Flink jdbc connector 源码改造sink之 clickhouse多节点轮询写与性能分析
《The Google File System》新说
typescript58-泛型类