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

转载于:https://www.cnblogs.com/Doner/p/11175408.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值