1、Flask组件
1.1、flask-script组件(pip3 install flask-script) -- 项目启动命令 python3 manage.py runserver
from flask_script_study import create_app
from flask_script import Manager
app = create_app()
manager = Manager(app)
# 项目启动命令:python3 manage.py runserver
app.secret_key = "isdnfj"
app.debug=True
@manager.command
def custom(arg):
# 自定义执行命令
# python3 manage.py custom 123
print(arg)
# 123
@manager.option("-n","--name",dest="name")
@manager.option("-u","--url",dest="url")
def cmd(name,url):
# 自定义执行命令
# python3 manage.py cmd -n szq -u http://www.baidu.com
print(name,url)
# szq http://www.baidu.com
if __name__ == '__main__':
manager.run()
1.2 flask-sqlalchemy组件应用(pip3 install flask-sqlalchemy)
一、定义配置文件,将连接字符串定义在配置文件中 settings.py
class Config(object):
DEBUG = True
# SECRET_KEY = "asdkqwdm"
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/orm?charset=utf8"
SQLALCHEMY_POOL_SIZE = 5
SQLALCHEMY_POOL_TIMEOUT = 30
SQLALCHEMY_POOL_RECYCLE = -1
# 追踪对象的修改并且发送信号(内部的信号机制)
SQLALCHEMY_TRACK_MODIFICATIONS = False
class ProductionConfig(Config):
pass
class DevelopmentConfig(Config):
pass
二、数据表文件内倒入db models.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy import Column, Integer, String
from flask_script_study import db
class Users(db.Model):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(32))
extra = Column(String(16))
三、__init__.py 创建db对象,然后将app传入到db中
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 包含了SQLAlchemy所有的操作
db = SQLAlchemy()
from .views import account
from .views import home
def create_app():
app = Flask(__name__)
app.config.from_object("settings.ProductionConfig")
app.register_blueprint(account.ac)
app.register_blueprint(home.ho)
# 读取配置文件(app.config)信息,帮助SQLAlchemy进行连接
db.init_app(app)
return app
四、test.py 通过实例化SQLAlchemy对数据库(表)实现操作,创建离线脚本
# 离线脚本,自定义的一个py文件+使用flask中定义好的文件
from flask_script_study import create_app
from flask_script_study import db
from flask_script_study import models
app = create_app()
# 一个对象可以执行with方法的前提是:对象内必须要有__enter__和__exit__方法
with app.app_context(): # 把app的上下文放到Local里面
db.drop_all() # 删除一张数据表
db.create_all() # 创建一张数据表
res = db.session.query(models.Users).all() # 查询表数据
print(res)
五、account.py 在视图函数中通过SQLAlchemy操作数据库
from flask import Blueprint,redirect,request,render_template,session,current_app
from uuid import uuid4
from flask_script_study import models
from flask_script_study import db
ac=Blueprint("ac",__name__)
uid=str(uuid4())
@ac.route("/login",methods=["GET","POST"])
def login():
obj = db.session.query(models.Users).all()
print(obj)
db.session.remove()
return "login"
1.3、sqlalchemy创建session的两种方式
1.3.1、方式一:通过在函数内定义session = Session()的方式。不能在函数外定义。
import models
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine, text, and_, or_
from threading import Thread
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8", max_overflow=5)
Session = sessionmaker(bind=engine)
def task():
session = Session()
data = session.query(models.Users).all()
for n in data:
print(n.name)
session.close()
for n in range(0,9):
t = Thread(target=task())
t.start()
1.3.2、方式二(用这个):通过scoped_session的方式。直接在函数内引用即可,不需要管session是谁创建的 (线程在创建session的时候通过调用Thread.local) 的方式。
import models
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from threading import Thread
from sqlalchemy.orm import scoped_session
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8", max_overflow=5)
Session = sessionmaker(bind=engine)
session = scoped_session(Session)
def task():
data = session.query(models.Users).all()
for n in data:
print(n.name)
session.remove()
for n in range(0,9):
t = Thread(target=task())
t.start()
1.4、flask-migrate组件 作用:做数据库迁移
使用方法:
python3 manage.py db init
python3 manage.py db migrate # 修改数据库表时使用
python3 manage.py db upgrade # 修改数据库表时使用
执行完毕后会生成:migrations 目录,versions目录内的文件记录每次变更。在数据库内生成"alembic_version"表,表的内容与versions目录内的文件对应。
代码如下:
在manage.py文件中添加"数据库迁移"部分的代码即可
from flask_script_study import create_app,db
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand
app = create_app()
manager = Manager(app)
# 数据库迁移
Migrate(app,db)
"""
# 通过"Migrate"做数据库迁移
python3 manage.py db init
python3 manage.py db migrate
python3 manage.py db upgrade
"""
manager.add_command("db",MigrateCommand)
@manager.command
def custom(arg):
# 自定义执行命令
# python3 manage.py custom 123
print(arg)
@manager.option("-n","--name",dest="name")
@manager.option("-u","--url",dest="url")
def cmd(name,url):
# 自定义执行命令
# python3 manage.py cmd -n szq -u http://www.baidu.com
print(name,url)
if __name__ == '__main__':
manager.run()
1.5 flask信号blinker (pip3 install blinker) 学习地址:https://www.cnblogs.com/wupeiqi/articles/8249576.html
1、信号的执行顺序:
appcontext_pushed = _signals.signal('appcontext-pushed')
request_started = _signals.signal('request-started')
# 如果有render:
before_render_template = _signals.signal('before-render-template')
template_rendered = _signals.signal('template-rendered')
request_finished = _signals.signal('request-finished')
# 如果视图函数有异常
got_request_exception = _signals.signal('got-request-exception')
request_tearing_down = _signals.signal('request-tearing-down')
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')
appcontext_popped = _signals.signal('appcontext-popped')
# 如果使用信号
message_flashed = _signals.signal('message-flashed')
2、信号触发例子:
from flask import Flask,signals
app=Flask(__name__)
# 定义信号触发时,执行的函数
def fun(*args,**kwargs):
print("信号触发:request_started")
signals.request_started.connect(fun)
# 请求http://127.0.0.1:5000/login,返回"信号触发:request_started"
@app.route("/login",methods=["GET","POST"])
def login():
return "login"
if __name__ == '__main__':
app.run()