Flask(基础原理)

一、基础

  • Linux命令(面试题):cd, vim, mkdir, ls, touch, cat, sed

  • 面向对象的特殊方法

obj['x1'] = 123 #set_item
obj.x = 123 #set_attr
obj + 123 #对应的都是双下划线的方法
# __call__, __new__, __end__
  • functiontools
new_func = funtiontools.partial(func, para1, para2)  #在调用时自动传入para1和para2参数
new_func(para3) #外加传入para3参数
  • 装饰器
    flask: 路由, before_request
    django: csrf, 缓存, 用户登录

二、配置文件(基础)

三、路由(基础)

from flask import Flask
app = Flask()
@app.route('x1', method=['POST','GET'])

def login():
  return 1+1

if __name__ == __main__:
  app.run()

四、视图(基础)

五、请求和相应

from flask import request

六、模板

from flask import template

七、session

  • session是特殊的字典
    from flask import session

(图) session原理

八、特殊装饰器(常用)

  • before_first_request:在用户第一次访问时,在执行视图函数前执行
  • before_request:在执行视图函数前顺序执行
  • after_request:在执行视图函数后倒序执行

九、闪现

  • 原理:在用户的session (type=dict)中存入一个值,在用户再次访问后.pop弹出该值,做到"阅后即焚"。(该功能用到很少,但需要知道)
    from flask import flash
@app.route('login', method='POST')
def login():
  flash('阅后即焚')
  return ''

@app.route('logout', method='POST')
def logout():
  get_flashed_message()
  return ''

if __name__=='__main__':
  app.run()
@app.route('login', method='POST')
def login():
  flash('阅后即焚', category='c1') #还可以加分类
  flash('闪现', category='c2')
  return ''

@app.route('logout', method='POST')
def logout():
  get_flashed_message(category_filter=['c1','c2'])
  return ''

if __name__=='__main__':
  app.run()

十、中间件

  • 原理:改变原来的类,如wsgi_app,实现自定义操作。(很少用到)
@app.route('x1', method='POST')
def x1():
  return 'x1'

class Middleware(object):
  def __init__(self, arg):  #服务器启动时自动执行
    self.arg = arg
  def __call__(self, *arg, **kwarg):  #每次有用户访问时执行
    print('执行前')
    obj = 1+1
    print('执行后') #执行前后都可以进行自定义操作,更多是用before_request和 after_request
    return obj #走到这里就停

if __name__=='__main__':
  app.wsgi_app = app.Middleware(app.wsgi_app )  #替换了原来的wsgi_app
  app.run()

十一、多线程threading.local

  • 线程原理:复制多一份原料出来操作,需要更多的空间
from threading import local
from threading import threading
from threading import get_ident
trds = local()

def func(para):
    trds.value = get_ident()
    print(trds.value) 

for i in range(5):
    t = Thread(target=func, args=(i,))
    t.start()

在类里面,修改 def _setattr_() 方法可以自定义 class.xxx = xxx的赋值方法
修改 _getattr_() 方法同理也可自定义 class.xxx的调用

十二、上下文管理(一定要会)

上下文管理.png
1.为什么吧ctx放到RequestContext里
  • ctx = RequestContext(request,session)
  • 如果分开两个类,增删改查会比较麻烦,将请求相关的参数统一管理使用起来更方便
2.Local 对象的作用
  • Local 与 threading.local相似,
  • Local 基于greenlet作为唯一表示,相比threading.local基于线程粒度更细。
3.LocalStack 对象的作用
  • 对Local里面的数据进行维护
  • 将Local里面的数据维护成一个栈
    Local = {
    123 : { stack: [ctx, ] }
    }
4.技术点
  • 反射
  • 面向对象,封装Request_Context
  • 线程(threading.local)
  • 笔试题:用一个类和列表,实现一个栈(LocalStack)

你可能感兴趣的:(Flask(基础原理))