# Web框架-flask

# Flask概述

微型框架,只实现核心功能,其他功能通过扩展实现
3个主要依赖 
- Werkzeug 提供 路由、调试和Web服务器网关接口WSGI
- Jianja2 模本系统
- Click 命令行
  • 启动与调试
export FLASK_APP=flasky.py
export FLASK_DEBUG=1
flask run

或者进入调试上下文
flask shell

@app.shell_context_processor
def make_shell_context():
    return dict(db=db, User=User, Role=Role)
这样 shell 中可以直接使用 db
  • 测试
# flasky.py
@app.cli.command()
def test():
    """
    Run the unit tests
    """
    import unittest
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)

export FLASK_APP=flasky.py
flask test

# 应用和请求上下文

为了让视图函数参数简单整洁,Flask使用上下文让特定的变量在一个线程中全局可访问,而不受其他线程干扰
current_app     应用上下文
g               应用上下文
request         请求上下文
session         请求上下文

# 数据库相关

  • 粗暴创建删除库表
db.create_all()
db.drop_all()
  • 增量创建库表
# 安装迁移三方
pip install flask-sqlalchemy
pip install flask-migrate

export FLASK_APP=flasky.py
flask db init
flask db migrate
flask db upgrade
  • 增删改查
# 新增
r1 = Role(name='Admin')
db.session.add(r1)
r2 = Role(name='User')
db.session.add(r2)
db.session.commit()

user = User(username='linda', password='123456', role_id=2)
db.session.add(user)
db.session.commit()

# 查找
role = Role.query.get(2)
role, role.users
queryset =User.query.filter_by(username='linda')
u = User.query.filter_by(username='linda').first()
u.username = 'tom'
db.session.commit()
# 删除
db.session.delete(u)
db.session.commit()

# Websocket

pip install websockets
pip install flask-socketio

# Flask2.0异步特性

import asyncio
from flask import Flask
 
app = Flask(__name__)
 
@app.get('/')
 async def say_hello():
    await asyncio.sleep(1)
    return {'message': 'Hello!'}