一、基础
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)