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:[email protected]: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:[email protected]: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:[email protected]: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()