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
- 不能够通过下标访问,一般是没有得到正确的实例类型
源码
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: