本部分基于图书《Flask Web开发》学习总结,后续将继续深入学习扩展知识。
学习计划
- Flask框架学习与实战
- Celery任务调度框架的深入学习与研究
- 基于WebSocket的网络通讯研究
- 高并发PyWeb框架Tornado
Chapter 1 安装
1.安装环境
为了防止学习过程中安装的libs干扰了工作环境,建议使用virtualenv或Anaconda来创建虚拟Python环境,与工作环境隔离。
virtualenv与Anaconda对比
- Anaconda支持多个python版本,可以创建py2、py3的环境,但是virtualenv只能创建目前系统正在使用的python版本来创建虚拟环境。
- Anaconda非常强大,有GUI操作界面,在学习机器学习时安装依赖非常方便。virtualenv就是单纯的创建了一个虚拟环境,很简单。
安装virtualenv
- sudo easy_install virtualenv
- mkdir ~/py_envs && cd ~/py_envs && virtualenv flask_env
- source flask_env/bin/activate
- deactivate (退出虚拟环境)
安装Flask
- pip install flask
Chapter 2 程序的基本结构
2.1 一个完整的程序
|
|
2.2 请求-响应
2.2.1 上下文
var_name | context | remark |
---|---|---|
current_app | 程序上下文 | 当前激活程序的程序实例 |
g | 程序上下文 | 处理请求时的临时存储变量 |
request | 请求上下文 | 请求对象,封装了客户端的HTTP请求中的内容 |
session | 请求上下文 | 用户会话,用于存储请求之间需要“记住”的内容 |
|
|
OUTPUTcurrent_app.name: hello
2.2.2 请求调度
|
|
OUTPUT
|
|
2.2.3 请求钩子
- before_first_request: 第一个请求之前运行
- before_request: 每次请求之前运行
- after_request: 如果没有未处理的异常抛出,在每次请求后运行
- teardown_request: 即使有未处理的异常抛出,也在每次请求之后运行
2.3.4 响应
make_response("<h1>Hello %s</h1>" % name, 200)
等价于 return "<h1>Hello %s</h1>" % name, 200
make_response的三个参数:返回字符串、状态码、HEAD
|
|
OUTPUT1cookie: None
OUTPUT2cookie: 100
2.3 Flask扩展
Flask被设计为可扩展形式,开发者可以自由选择合适的程序包。下面以Flask-Sript给Flask提供命令行扩展为例。
pip install flask-script
安装- 添加命令行解析功能
|
|
- 执行main函数看到命令行提示
|
|
- 在命令行执行
python hello.py runserver
启动flask应用(app.run())
|
|
- runserver 的参数
|
|
其中 –host 非常有用,可以指定当前web服务只可以被指定的IP来源进行访问。
- –host 127.0.0.1 web服务只接受来自本机的请求
- –host 0.0.0.0 web服务可以接收同局域网中的其他PC的请求
Chapter 3 模板
Flask内置Jinjia模板引擎,用于渲染视图,将数据与展示分离。
jinjia2官方文档
jinjia2中文翻译文档
3.1 Jinjia2模板引擎
渲染
- 默认情况下,flask会在templates文件夹中寻找模板
- 创建templates文件夹
- 创建user.html
|
|
- 后台接口代码
|
|
- 请求该接口,返回渲染后的HTML内容
变量
- jinjia能识别所有类型的变量,例如 字典、列表、对象等。
|
|
|
|
- 可以使用过滤器修改变量
·- safe 渲染时值不转义(不要在不可信的值上使用safe过滤器,例如用户表单锁输入的内容)
- capitalize 手写字母转换成大写,其他小写
- lower 转小写
- upper 转大写
- title 每个单词首字母大写
- trim 去除首尾空格
- striptags 渲染之前把值中所有的HTML标签都删掉
控制结构
|
|
|
|
导入模板
macros.html
|
|
user.html
|
|
继承
base.html
|
|
index.html
|
|
3.2 集成Flask-Bootstrap
Bootstrap的基模板(bootstrap/base.html)提供了一个网页框架,引入了Bootstrap中所有的CSS和JavaScript文件。
|
|
base.html
|
|
user.html
|
|
3.3 自定义错误页面
|
|
404.html
|
|
3.4 链接
在模板中使用url_for来创建链接地址,而不是写死
base.html
|
|
注意上面有坑: {% block content%} 是页面自定义内容,它对应的{% endblock %} 一定要放到所有需要展示内容的最后,否则不会被页面读取到。
user.html
|
|
_external表示使用相对/绝对路径,一般使用相对路径。
3.5 静态文件
Jinjia默认情况下会到static文件夹中搜索静态文件<img src="{{url_for('static',filename='head.jpeg')}}"/>
Chapter 4 Web表单
知识点:
- 跨站请求伪造保护(CSRF)
- 继承Form表单的用户自定义表单类
- 标准字段(XXXField)
- 验证函数
- 把表单渲染成HTML
{{form.name()}}
- bootstrap的辅助函数 wtf.quick_form()
- 在视图函数中处理表单 form.name.data
- POST重定向GET模式(防止刷新浏览器出现重复踢脚表单提示)
- redirect的使用
- url_for(‘fun_name’) 的参数fun_name不是路由地址而是试图函数的名称
- Flash消息
- 试图函数中 使用flash(msg)创建消息
- 模板中使用get_flashed_messages()获取消息列表
|
|
user.html
|
|