写在前面
学docker
编排,有一个用Flask
框架的Demo
,感觉挺方便,所以学习下基于《Flask Web开发实战:入门、进阶与原理解析》
做的读书笔记个人还是比较喜欢看书,看书的话节奏可以自己把握,内容可以全部呈现,选择适合自己的学习,更重要的原因,书里的知识面更广,有利用知识体系的构建。当然视频也不错,内容比较精炼,但是好坏参差,一般要选大一点培训机构的视频比较好。所以一般先看书,然后看视频加深记忆。还在更新中一辈子很长,就找个有趣的在在一起——王小波《三十而立》
第一部分
第一章 初识 FLask
from flask import Flaskapp=Flask(__name__)#为视图绑定多个URL@app.route("/")@app.route("/index")def hello():return "<h1>liurilong</h1>"## 动态URL@app.route("/user/<name>")def printName(name):return nameif __name__ == "__main__":app.run(host='127.0.0.1', port=8085,debug=True)
环境准备
#虚拟环境mkvirtualenv #创建虚拟环境rmvirtualenv #删除虚拟环境workon #进入虚拟环境、查看所有虚拟环境deactivate #退出虚拟环境#pippip install #安装依赖包pip uninstall #卸载依赖包pip list #查看已安装的依赖包pifreeze #冻结当前环境的依赖包
第二章 Flask 与 HTTP
2.1 请求响应循环
web服务器接收请求,通过WSGI将HTTP格式的请求数据转换成我们的Flask程序能够使用的Python数据。
在程序中, Flask根据请求的URL执行对应的视图函数,获取返回值生成响应。响应依次经过wsGI转换生成HTTP响应
,再经由Web服务器传递,
最终被发出请求的客户端接收。浏览器渲染响应中包含的HTML和css代码,并执行JavaScript代码,最终把解析后的页面呈现在用户浏览器的窗口中。
2.2 HTTP请求
2.2.1 请求报文
2.2.2 Request对象
请求解析和响应封装实际上大部分是由Werkzeug
完成的, Flask子类化Werkzeug
的请求(Request)和响应( Response)对象并添加了和程序相关的特定功能。
@app.route("/param")def param():name = request.args.get('name','Flask')return name
Werkzeug的MutliDict类是字典的子类
,它主要实现了同一个键对应多个值的情况
。比如一个文件上传字段可能会接收多个文件。这时就可以通过getist()
方法来获取文件对象列表。而ImmutableMultiDict
类继承了MutliDict
类,但其值不可更改。
2.2.3 在Flask中处理请求
路由匹配为了便于将请求分发到对应的视图函数,程序实例中存储了一个路由表(app.url_map)
,其中定义了URL规则和视图函数的映射关系
。
当请求发来后, Flask会根据请求报文中的URL(path部分)来尝试与这个表中的所有URL规则进行匹配,调用匹配成功的视图函数。如果没有找到匹配的URL规则,说明程序中没有处理这个URL的视图函数, Flask会自动返回404错误响应(Not Found,表示资源未找到)。
print(app.url_map)####Map([<Rule '/index' (HEAD, GET, OPTIONS) -> hello>,<Rule '/param' (HEAD, GET, OPTIONS) -> param>,<Rule '/' (HEAD, GET, OPTIONS) -> hello>,<Rule '/static/<filename>' (HEAD, GET, OPTIONS) -> static>,<Rule '/user/<name>' (HEAD, GET, OPTIONS) -> printName>])
路由匹配:
每一个路由除了包含URL规则外,还设置了监听的HTTP方法。GET
是最常用的HTTP方法,所以视图函数默认监听的方法类型就是GET, HEAD
,OPTION
方法的请求由Flask处理,而像
DELETE,PUT等方法一般不会在
程序中实现,在后面我们构建
WebAPI时才会用到这些方法。我们可以在
app.route()装饰器中使用methods参数传入一个包含监听的HTTP方法的可迭代对象`,下面的视图函数同时监听GET请求和POST请求:
@app.route("/param",methods=['GET','POST'])Map([<Rule '/index' (GET, HEAD, OPTIONS) -> hello>,<Rule '/param' (GET, HEAD, POST, OPTIONS) -> param>,<Rule '/' (GET, HEAD, OPTIONS) -> hello>,<Rule '/static/<filename>' (GET, HEAD, OPTIONS) -> static>,<Rule '/user/<name>' (GET, HEAD, OPTIONS) -> printName>])
设置监听的HTTp方法
## 设置监听的 http 方法@app.route("/param",methods=['GET','POST'])def param():name = request.args.get('name','Flask')print(app.url_map)return name
URL处理
## URL解析@app.route('/goback/<int:year>')def goback(year):return '<p>Weloc... to %d</p>' % (- year)
2.2.4 请求钩子
有时我们需要对请求进行预处理( preprocessing)
和后处理(postprocessing)
,这时可以使用Flask
提供的一些请求钩子( Hook),它们可以用来注册在请求处理
的不同阶段执行
的处理函数(或称为回调函数,即Callback
)。这些请求钩子使用装饰器实现.
@app.before_requestdef do_something():pass #这里的代码会在每个请求前运行
after request钩子和after-this request钩子必须接收一个响应类对象作为参数,并且返回同一个或更新后的响应对象。
2.3 HTTP响应
2.3.1在Flask中生成响应报文
# 指定状态码@app.route('/hello')def hell():return 'hello',201# 指定状态码,响应首部字段@app.route('/hello')def hello():return '',302,{'Location',''}
重定向
from flask import Flask,redirect# 重定向@app.route('/hello')def hello():return redirect('');# 重定向到视图 def hello_():return redirect(url_for('hello'))
2.3.1在Flask中生成响应
响应在Flask中使用Response对象表示,响应报文中的大部分内容由服务器处理,大多数情况下,只负责返回主体内容。
Flask会先判断是否可以找到与请求URL相匹配的路由
如果没有则返回404响应。如果找到,则调用对应的视图函数,视图函数的返回值构成了响应报文的主体内容,正确返回时状态码默认为200
, Flask会调用make_response()
方法将视图函数返回值转换为响应对象
。
视图函数可以返回最多由三个元素
组成的元组
:
响应主体状态码首部字段(首部字段可以为字典,或是两元素元组组成的列表)。