Flask,7

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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章