flaskr 进阶笔记

Flask 应用

  • flask核心依赖
    • Jinja2 模板引擎,负责数据显示
    • Werkzeng WSGI工具集,主要是路由这块
  • 应用创建函数create_app
    • 函数内部创建 Flask 实例来代替创建全局实例,类似于laravel中的app容器
  • 应用实例包
    • __init__ 包含应用工厂
    • 将flaskr文件夹作为一个包
    • 返回一个应用实例,该实例app是应用的主线,后续蓝图实例在其上注册,命令行装饰器与之关联
  • 配置加载
    • 配置方式,文件,对象多种方式
    • 实例文件夹 在 flaskr 包的外面
  • 启动
    • 进入项目目录(使用命令行需要设置环境变量)
    • windows/linux (set 改为export)
set FLASK_APP=flaskr
set FLASK_ENV=development
flask run
  • flaskr
# ~/flaskr/__init__.py
import os
from flask import Flask

def create_app(test_config=None):
    # 创建和配置Flask应用实例
    app = Flask(__name__, instance_relative_config=True)
    # 设置一个应用的 缺省配置
    app.config.from_mapping(
        SECRET_KEY='pardon110',
        # 设置数据库存储路径
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite')
    )
    # 使用文件来重载缺省配置
    if test_config is None:
        # 加载配置文件
        app.config.from_pyfile('config.py', silent=True)
    else:
        app.config.from_mapping(test_config)
    # 确保 app.instance_path 存在,Flask 不会自动 创建实例文件夹
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # 导入注册数据库
    from . import db
    db.init_app(app)

    # 导入和注册蓝图
    from . import auth, blog
    app.register_blueprint(auth.bp)
    app.register_blueprint(blog.bp)
    app.add_url_rule('/', endpoint='index')
    return app

数据库

  • sqlite3
    • Python 内置了 SQLite 数据库支持,不需要单独配置数据库服务器,但不适合高并发请求
  • 连接数据库
    • 在网络应用中连接往往与请求绑定,建立连接,发送请求
  • 创建表
    • sqlite3 多条sql执行,上下文管理器
    • 概念 命令行装饰器(交互性) 模块click(输出美化)
  • 在应用中注册
    • app.teardown_appcontext() 应用实例结束清理
    • app.cli.add_command() 添加Flask命令(注册数据库命令行)
  • 初始化数据库文件
    • flask init-db

蓝图和视图

  • 视图
    • 一个应用对请求进行响应的函数
    • URL 匹配 --> 视图 + 数据 --> 响应
  • 蓝图(Blueprint)
    • 目的 组织一组相关视图及其他代码的方式,主要是为了模块化编程
    • 视图 + other代码 --注册蓝图--> 工厂函数内注册应用
    • flask 中的蓝图相当于mvc中的控制器部分
  • 主程序
    • @bp.route 使用蓝图实例上的route装饰器,将url与视图函数(请求处理器)关联
    • request.form 请求数据
    • werkzeug.security 安全验证,数据加密函数
    • @bp.before_app_request 在视图函数之前运行的函数
  • 端点和url
    • url_for() 函数根据视图名称和发生成 URL,缺省情况下,端点名称与视图函数名称相同
    • 当使用蓝图的时候,蓝图的名称会添加到函数名称的前面

模板

  • jinja 模板引擎
    • {{ }} 静态数据输出
    • {% %} 流程控制语句
  • 基础布局
    • 模板继承
    • 代码段填充

问题集

  • TypeError: 'builtin_function_or_method' object is not subscriptable
    • 不能够通过下标访问,一般是没有得到正确的实例类型

源码

flaskr全部源码

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!