本篇我们运用
首先找到Flask的官方文档: http://flask.pocoo.org
首先找到如何启动一个最小规模的可以运行的Helloword
在hello.py所在的目录运行程序
完成上面步骤就可以开始入门之旅了.
一. 定义控制器和配置路由
Flask 中的控制器就是一个简单的函数, 控制器的路由配置通过给函数加上装饰器来实现.
文档中位置:Routing
1.1 定义方法
@app.route('URL', methods=[允许接收的HTTP方法列表])
1.2 URL参数
在URL中带有<参数名>这样的部分或者<参数名:参数类型>这样的写法, 就可以在URL中定义参数, 比如 '/get_file/
定义了参数的URL路由对应的函数, 必须包含对应的参数, 比如
参数如果带了类型, 必须是下面几种类型之一:
1) string 不能包含反斜杠
2) int 整数
3) float 浮点数或者整数
4) path 包含反斜杠在内的字符串
5) any 所有的字符
6) uuid 只允许uuid字符串
如果定义了类型, flask会将传入的参数转换成对应的类型.
二. 输入输出
大部分获取环境数据的方法都是通过flask的request对象类获取的, 详细文件可以参见:传送门
而输出的对象是flask的Response类的实例, 可以通过make_response来生成, 详细的文档可见:传送门
2.1. 如何获取Query String参数?
from flask import request
request.args.get('name')
request是当前请求的flask.Request类的实例. 属性args可以当作一个字典来访问.
2.2.如何获取Form表单的数据(Json body)?
from flask import request
request.form.get('name')
form属性是封装过的类似字段的数据类型, 支持一个key有多个值, 当一个key有多个值的时候, 通过key获取到的是一个数组, 包含了所有这个key的值.
request.json 可以获取用Json body方式提交的数据, request.is_json 可以用来检测body里是不是json类型的数据.
原始的body数据通过 request.data 访问
2.3. 如何读取和修改cookie?
from flask import request
request.cookies.get('name')
cookies是一个类似字典的数据结构, 按照字典的方式访问即可. 这个字典是只读的, 所以设置cookie要通过Response对象
from flask import make_response
response = make_response('
Test
')response.set_cookie('name', value)
2.4. 如何获取headers?
from flask import headers
request.headers.get('Authorization')
headers是一个类似字典的数据结构, 按照字段的方式访问
2.5. 如何实现页面转跳?
from flask import redirect
redirect('url')
2.6. 如何输出Http响应?
输出模板渲染结果
from flask import render_template
@app.route('/')
def handler():
return render_template('template_path', **locals())
输出json
from flask import jsonify
@app.route('/')
def handler():
return jsonify(key=value...)
三. 模板引擎
flask内置了jinja2模板, 并且入上一节提供了render_template快捷方法. 只要在hello.py所在目录下创建个目录-templates, 把模板文件放进去就好了.
jinja2的模板就是一个普通的html文件, 其中加入jinja2的占位符即可.
3.1. 占位符如何定义
{{ key }}
render_template的keywords参数传入的key, 用{{ }} 括起来就是一个占位符了. 模板中新定义的变量用{{ }}括起来也是一个占位符.
3.2. 如何定义循环
{% for item in 列表 %}
{{ item.property }}
{% endfor %}
3.3. 如何定义判断条件
{% if 判断条件 %}
{% else %}
{% endif %}
3.4. 如何对占位符加过滤器
{{ variable | 过滤器名 }}
flask内置了几个过滤器 tojson和safe, 如果需要还可以自己定义自定义过滤器. 过滤器可以嵌套使用, 比如 {{ var | tojson | safe }}
3.5. 如何定义继承模板
首先要定义一个基础模板, 比如base.html, 在其中需要继承模板替换的地方, 定义一个命名的block, 比如:
{% block name%} {% endblock %}
然后定义一个集成模板, 比如 enh.html, 第一行定义 extends 来指明继承自哪个基模板, 然后用block来覆盖基模板的相同名字的block
{% extends "base.html" %}
{% block name %}
子模板内容
{% endblock %}
3.6. 如何定义嵌套模板
{% include "snap.html" %}
四.中间件
通过装饰器将函数注册为中间件的钩子
@app.before_first_request 当第一个请求执行前执行
@app.before_request 每一个请求执行前执行
@app.after_request 每一个请求执行后执行
@app.teardown 当请求执行抛出未catch的异常后执行
五.统一错误处理
通过@app.teardown
六.鉴权和Session
flask没有提供自带的鉴权机制, 但是为了方便你自己实现鉴权, flask提供了一些机制
from flask import request
user_name = request.authorization.user_name
password = request.authorization.password
可以获取到Basic Auth的鉴权信息
Session读写
from flask import session
session[key] = value
variable = session[key]
Flask的Session是基于cookie的, 所以不要放入太大的内容
七.生产部署的方式
用gunicorn来host应用服务
pip install gunicorn
然后就可以用
gunicorn -w worker进程数量 -b 绑定IP:端口号 --timeout 执行超时时间 hello:app
的方式启动
Web服务器用Nginx, 通过Upstream把请求反向代理到gunicorn的应用服务
upstream api {
server 127.0.0.1:端口;
}
server {
listen 80;
server_name 域名;
location /static {
root /静态文件地址;
}
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_redirect off;
proxy_pass http://api;
proxy_next_upstream error;
}
}
按照以上套路学习完毕看是不是可以入门Flask了呢?