一 上下文管理

当前请求到来时Flask处理的流程图:

当一个请求到来时:

请求到来之后uwsgi会触发app的__call__方法, 由__call__方法再次调用wsgi_app方法

 首先将请求相关+空session封装到一个RequestContext对象中 即 ctx # self是app对象, environ请求相关的原始数据,含有self.request

通过ctx.push()将ctx交给LocalStack对象,再由LocakStack将ctx添加到Local中,local结构:

__storage__={
        1231:{stack:[ctx,]},  # {线程id:{"stack":[]}}
        1232:{stack:[ctx,]}
}

 

 

当执行视图函数导入request模块后 执行_lookup_req_object偏函数,传递request或者session

_request_ctx_stack.top取出stack中最后一个数据并使用getattr(obj,name)的方式返回request或者seession中的数据

top相当于取出来的ctx, name为偏函数传递的request或者session

top的执行过程

当我们使用request.method 调用LocalProxy中的__getattr__方法取出method中的数据

执行_get_curren_object 执行self.__local()然而__local实际上就是我们的偏函数lookup_req_object(request)

 

 

二 flask-sqlalchemy

1 下载安装

pip3 install flask-sqlalchemy

2 crm.__init__.py

导入并实例化SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
注意事项:

  • 必须在导入蓝图的上边
  • 必须导入models.py

3 初始化

db.init_app(app)

4 在配置文件中写入配置

SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/databasename?charset=utf8"
SQLALCHEMY_POOL_SIZE = 10
SQLALCHEMY_MAX_OVERFLOW = 5

5 创建models.py中的类(对应数据库的表)

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer,String,Text,Date,DateTime
from sqlallchemy import create_engine
from crm import db

class Users(db.model):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=False)
    depart_id = Column(Integer)

6 生成表(使用app上下文) createtale.py

from crm import db,create_app        
app = create_app()
app_ctx = app.app_context() # app_ctx = app/g
with app_ctx: # __enter__,通过LocalStack放入Local中
    db.create_all()

7 基于sqlalchemy生成数据

def index():
    db.session.add(models.User(name='harry', depart_id=1))
    db.session.commit()
    db.session.remove()

三  flask-script

flask-script功能类似于Django的manage,可以通过命令行的方式对项目进行管理

安装:pip3 install flask-script

1 增加 runserver

from crm import create_app
from flask_script import Manager

app = create_app()
manager = Manager(app)

if __name__ == '__main__':
    manager.run()

2 位置传参

from crm import create_app
from flask_script import Manager

app = create_app()
manager = Manager(app)

@manager.command
def custom(arg):
    '''
    自定义命令
    python manag.py custom 123
    '''
    print(arg)
    
    if __name__ == '__main__':
        manager.run()

3 关键字传参

from crm import create_app
from flask_script import Manager

app = create_app()
manager = Manager(app)

@manager.option('-n', '--name', dest='name')
@manager.option('-u', '--url', dest='url')
def cmd(name, password):
    '''
    自定义命令
    执行 python manag.py cmd -n harry -u 123123
    '''
    print(name,password)
    
    
    if __name__ == '__main__':
        manager.run()

四  flask-migrate

通过命令行的方式生成数据库

安装: pip3  install flask-migrate

依赖:flask-script

from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

app = create_app()
manager = Manager(app)
Migrate(app, db)

'''
数据库迁移命令
    python manage.py db  init_app
    python manage.py db  migrate 
    python manage.py db  upgrate
'''

manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
    manager.run()

 

posted on 2019-07-11 18:24  cs_1993  阅读(263)  评论(0编辑  收藏  举报