Flask 笔记
1.CBV 模式
1.继承 views.MethodView
from flask.views import MethodView
2.HTTP具有 8 种请求方法 - CBV中的方法
- GET 获取
- POST 增加
- DELETE 删除
- PUT 更新
- OPTIONS 跨域请求
- HEAD ?
3.例子
from flask import Flask
from flask.views import MethodView
app = Flask(__name__)
class Login(MethodView):
# decorators = []
# methods = ["GET", "POST"]
def get(self):
pass
def post(self):
pass
app.add_url_rule(rule="/login", endpoint=None, view_func=Login.as_view(name="login"))
- 此处 Login.as_view(name="login") 其中的 name 所指定的即 endpoint 所指定的
- 若 endpoint 不为 None 则 Login.as_view(name="login") 中指定的不会将其覆盖
-- 见源码
@setupmethod
def add_url_rule(
self,
rule,
endpoint=None,
view_func=None,
provide_automatic_options=None,
**options
):
if endpoint is None:
endpoint = _endpoint_from_view_func(view_func)
options["endpoint"] = endpoint
--- 此处 _endpoint_from_view_func(view_func) 见源码, 返回值为 view_func.__name__
def _endpoint_from_view_func(view_func):
assert view_func is not None, "expected view func if endpoint is not provided."
return view_func.__name__
综上, 若 endpoint 不等于 None 则直接使用 endpoint 参数被赋予的值 options["endpoint"] = endpoint
4.创建API建议使用CBV模式
2.串讲 Flask
1.Flask优势:
- 轻量级框架, 扩展性强, 三方组件齐全
2.Flask劣势:
- 过简, 只有 session 组件, 其他组件是第三方的, 稳定性相对较差
3.安装
pip3 install Flask
4.依赖包
- Jinja2 模板语言
- Flask 源码
- MarkupSafe 处理标签语言
- Werkzeug 封装 WSGI 的工具包, 承载 Flask 程序
-- - app.run() 本质上是执行run_simple() 见源码
def run(self, host=None, port=None, debug=None, load_dotenv=True, **options):
...
from werkzeug.serving import run_simple
try:
run_simple(host, port, self, **options)
finally:
self._got_first_request = False
5.启动
from flask import Flask
app = Flask(__name__)
app.run("0.0.0.0", 9527)
- 0.0.0.0 监听当前机器所有 IP
6.路由视图
@app.route(rlue="/index", methods=["GET", "POST"], endpoint="index")
def index():
return "Hello"
- endpoint 做 Mapping 使用 -> "/index": {"index": index}
-- 可通过 url_for("endpoint_value") 进行反向解析, 得到 rule_value
- methods 当前路由允许的请求方式
-- methods 默认为("GET",)
7.FlaskResponse
- render_template()
- redirect("")
- HttpResponse
-- [String, List, Tuple, Dict]
--- return "String"
--- return [String, List, Tuple, Dict]
--- return (String, List, Tuple, Dict
--- return {key: value} - Flask-1.1.1 新特性, 可以直接返回 dict 类型 - 本质上就是 jsonify
* jsonify
** Response Heads 中 Content-Type:application/json
** Flask-1.1.1 新特性, 可以直接返回 dict 类型 - 本质上就是 jsonify
* send_file 打开并返回文件内容, 自动识别文件类型 Content-Type:文件类型
** 无法识别的文件类型触发下载(浏览器实现)
8.FlaskRequest
- from flask import request 公共变量 LocalProxy 对象
------ Django ------- == ----- Flask ---------------------
-- request.POST.get() == request.form.get() -> .to_dict() | 获取FormData中的参数
-- request.GET.get() == request.args.get() -> .to_dict() | 获取URL中的参数
-- request.files.get() | 获取文件
-- request.method | 获取请求方式
-- request.path | 获取路由地址
-- request.url | 获取访问路径
-- request.host | 获取服务器地址 127.0.0.1:9000
-- request.host_url | 获取完整的服务器地址 http://127.0.0.1:9000
-- request.json | Content-Type:application/json 的请求数据
-- request.data | Content-Type 无法被识别, 或者是没有 form 的请求数据
9.session
from flask import session
app = Flask(__name__)
app.secret_key = "!@#$%^&*()"
- 使用 session 必须设置 secret_key 否则报错
...
session["key"] = value
...
- 存储在 Cookies 中
- 序列化 - {key: value} -> secret_key + 时间戳 + 签名 -> 生成 String -> SESSION_COOKIE_NAME:String
- 反序列化 - SESSION_COOKIE_NAME:String -> secret_key + 时间戳 + 签名 -> {key: value}
10.配置