• Flask详解(下篇)


    一 上下文管理

    当前请求到来时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()
  • 相关阅读:
    【转】Java学习---HashMap的工作原理
    【转】Java学习---集合框架那些事
    Linux学习---linux下的彩蛋和各种有趣的命令
    【转】VMware虚拟机三种网络模式超详解
    沃顿商学院的MBA课程
    本杰明-富兰克林的13节制
    美学需要读的书
    芒格推荐书单
    回声消除(AEC)原理
    adc0和adc1
  • 原文地址:https://www.cnblogs.com/harryblog/p/11171831.html
Copyright © 2020-2023  润新知