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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值