Title: Bilibili
P8
- 使用字符串来导入类
__import__(name, globals=None, locals=None, fromlist=(), level=0)
config
的配置文件路径默认在根目录下,需要更改目录的话,要查看对应的Api文档。
P9
__name__
函数调用的话,可以获取这个函数的名称。
P18
- 怎么用父类去约束子类必须实现某方法,意指接口(
interface
)。
class Base(object):
def play():
raise NoImplementedError('必须实现该方法')
顺带一提 P18 这一讲当中大概是 20 几分钟左右讲到的配置去做某事的思路对我启发蛮大。并且有助于理解 Django 的中间件。
装饰器可以有多个,下面的会和被装饰的函数当成 inner 加入到上层的装饰器当中去。
endpoint
的意义目前理解为id
。
P19
- 利用
functools.wraps()
来帮助我们设置函数的元信息
import functools
def wapper(func):
@functools.wapper(func) # 保存元信息
def inner(*args, **kw):
return func(*args, **kw)
return inner
@wapper
def foo():
pass
print(foo.__name__)
'''
如果不设置元信息的话,会导致打印的是 inner
设置之后才可以确定是原先的函数
'''
P20
闪现:类似于暂时存储部分内容的快照,取出来就没了。(阅后即焚)
应用场景:对临时数据的操作,例如错误信息。
请求扩展,指的是在请求之前和响应之前的监听,可以有多个监听,请求之前的监听是顺序执行,响应的是倒序执行。
@app.before_request
def before_request_1(*args, **kw):
print("before_request_1 进来了")
@app.before_request
def before_request_2(*args, **kw):
print("before_request_2 进来了")
@app.after_request
def after_request_1(response):
print("after_request_1 走了")
@app.after_request
def after_request_2(response):
print("after_request_2 走了")
'''
打印顺序为
before_request_1 进来了
before_request_2 进来了
...
after_request_2 走了
after_request_1 走了
'''如果请求拦截之后,在他之后的请求就不会执行了,但响应的还是会继续执行。
根据状态码定义错误信息
@app.errorhandler(404)
def error_404(args):
return "404页面没找到"before_first_request
第一个请求@app.before_first_request
def first(*args, **kw):
## 连接数据库之类的
pass
P22
- 中间件的讲解 P22
P25
threading.local()
给每个线程开辟一个内存空间用以对应的线程执行相应操作。达到类似加锁的目的。
P36
- 数据的链接池库采用
DBUtils
,但如果使用的是PooledDB
模式的话,其中有个参数需要注意maxshared
: 链接池中最多共享的链接数量。0 为全部共享,但这个值设置的时候是由creator
的threadsafety
来判别的,也就是说设置后不一定会生效。