flask3
2019.7.12 flask3
1 . CBV - FBV
Http请求方式 8种
class Login(views.MethodView):
def get(self):
pass
def post(self): #增
pass
def delete(self): #删
pass
def put(self): #更新 改
pass
另外四个(不是很重要)
def options(self): #请求跨域 , 不一样的话
pass
#header trace patch
route本质上 执行 app.add_url_rule()
views.py --> view -->def as_view() : #name - 'login'
def view(*args, **kwargs): #闭包
self = view.view_class(*class_args,**class_kwargs)
view - func
if cls.decorators: #没有 #decorators = [a,b,c,d] 可以写到 class Login
... #执行任一个函数,都经过这个装饰器
view.view_class = cls #Login
view.__name__ = name
view.__doc__ = cls.__doc__ #注释"""woshi ..lei"""
view.__module__ = clas.__module__
view.m = cls.methods
view.pro_a_o = cls.p_a_o
#view.__name = 'login'
#view_class = Login
#methods = None
发起login请求
app.add_url_rule('/login',endpoint=None,view_func=Login.as_view(name='login')) #name 填充 endpoint 有值就没用了 先执行里面的函数
if end is None:
e = e_f_v_fu(view_func) #没有值给他name的 name必填
options['end']=endpoint 有值 就是给了 app.py
def view(*,**)
self = view.view_class(*c_a,**c_k)
return self.d_r(*a,**kw)
view.py --> def init
super
if 'method' not in d:
set()
for base in bases:
for key in http_method_funcs:
if hasattr(cls,key):
methods.add(key.upper())
if methods :
cls.methods = methods
类里的方法(请求方式) 没有在http_method_funcs
def gets():
改源码.... 的h_m_f
dispatch_request(self,*a,**kw):
meth = getattr(self,request.method_lower(),None) #get
return meth(*a,**kw) #get
昨天
methods = getattr(view None) or GET #得到GET 为空
2 从头到尾复习 Flask
Flask 优势:
轻量级框架,扩展性,三方组件全
Flask 劣势:
太轻了,只有一个Session,组件是第三方的,稳定性相对较差(小伙伴都长大了)
连session都给了客户端的了
pip3 install Flask
Jinja2 模块语言 (也是一个包)
Flask 源码
MarkupSafe 处理标签语言 render_template
Werkzeug ~~ UWSGI(差不多) 本质都是WSGI (1更轻 2 稳定) 德语工具的意思
app.run run点进去
form - = ~.serving import run_simple
try :
run_simple #本质上就是执行这个
1 启动Flask
from flask import Flask
app = Flask(\__name__)
app.run('0.0.0.0',9527) #机器所有的ip
127.0.0.1: 只能本级访问本机
2 路由视图
@app.route('/index',methods=['GET','post'])#默认是get的元祖,覆盖
def index():
return 'hello'
methods 当前路由允许的请求方式
endpoint Mapping -> '/index' {'index':index}
% 元祖增删改查:
改:tu = (1,2,3,4) --> 改成列表
tu_l = list(tu)
tu_l.append(5)
tu = tuple(tu_l)
3 FlaskResponse
1 render_template(.html) #response本质上
2 redirect('/login')
3 '' #django 要写Httpresponse
4 jsonify # response headers: content-type:application/json
-Flask 1.1.1 新特性 可以直接返回dict类型 - 本质上就是在jsonify({'k':1})
5 send_file #自动打开并返回文件内容识别文件类型 contype-type:文件类型
4 FlaskRequest
from flask import request #公共变量 LoaclProxy 对象
request.POST.get() == request.form.get() -> .to_dict()
#类里面如果有两个单词 会驼峰写 有的会下划线分割 统计下
request.GET.get() == request.args.get() -> .to_dict()
request.json # 请求头中带有content-type: application/json
request.data # content-type 无法被识别 或者是 没有Form
request.files.get() 获取文件
request.method
request.headers
request.cookie
request.path
request.url
request.host
request.host_url
5 Session
form flask import Session
app.secret_key = '#%#^^^$#$'
def vf():
session['name'] = 1
存储在Cookies中
序列化 -{name:1} -> secret_key + 时间 + 签名 -> 生成一个字符串 -> SESSION_COOKIE_NAME : '生成一个字符串'
反列化 - SESSION_COOKIE_NAME : '生成一个字符串' -> -> secret_key + 时间 + 签名 ->{name:1}
6 Flask配置
1 初始化 - app = Flask(__name__)
templates_folder #模板存放
static_folder #静态文件存放
static_url_path #静态文件访问
2 Config Flask 对象配置
Flask.default_config #获取默认配置 #改了里面的东西没用
DEBUG 重启 日志级别 开发/线上 透传
TESTING
SESSION_COOKIE_NAME
SECRET_KEY
class DebugSetting(object):
DEBUG = True
SESSION_COOKIE_NAME = 'i am not session'
SECRET_KEY = "#%&@*%&#"
Flask.config.form_obj() ---> Flask.config['DEBUG'] = True
7 蓝图 ('bpname',_name_)
from flask import Blueprint
不能被run的Flask实例,没有config
蓝图作用 - app隔离 , URL管理
#Alexander.DSB.Li
userBP = Blueprint('userBP',__name__,url_prefix='/user')
@userBP.route('/userBP')
def user_bp():
return ''
思考: 如何在蓝图中使用 CBV 结构
8 特殊装饰器
1 before_request #进入视图函数之前
2 after_request #结束视图函数之后,响应客户端之前
3 errorhandler(HTTP_ERROR_CODE) #5xx 4xx 重定义错误信息
be + af 实现中间件:
正常周期:be1 be2 - vf - af2 - af1
异常周期:be1 - vf - af1
@app.template_global #全局装饰器
def ab(a,b):
return a+b
9 CBV
from flask import views
class Login(views.MethodView):
methods = []
def get(self): #满足http1.0协议 8 请求 #反射拿到各种方法,放到methods里
pass
def post(self):
pass
Flask.add_url_rule(rule='/login',endpoint=None,view_func=Login.as_view(name='login')))
Flask-Session
自己看的话觉得复杂?认知太少了
Session(app)
app.session_interface = self._get_in(app)
def _get_inter(app): #app = Flask(__name__)
config = app.config.copy() #浅copy
config.setdefault('SESSION_TYPE', 'null') #有则不变,无则改之 default_没有都设置了
redis不要被暴露在外网中,防止黑客修改
session 存的id 1111
open_session #序列化
save_session : 反序列化
get session:u58430-842395304583950-3283 #get(key+sid) #键
先给配置
flask_session 读取 配置 吸取配置 改配置
所有的flask第三发组件 都是需要 app.config 不但需要吸取配置项还要修改
app.config['SESSION_TYPE'] = 'redis'
app.config['SESSION_REDIS'] = Redis(host = '127.0.0.1',port=6527,db=6)
Session(app) #Flask-Session 读取config配置 改写app中的sessions-interface
from flask import
Flask-Session
Flask-CORS
Flask-WTF
Flask-SQLAlchemy ORM #所有的三方应用都是基于config来的,会一个都能用