一 上下文管理
当前请求到来时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()