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来的,会一个都能用

posted @ 2019-07-12 12:35  learnacode  阅读(242)  评论(0编辑  收藏  举报