NSF Back-end Dev Engineer

flask拾遗

2021-09-06
nsf

flask学习的一些记录

1.项目结构

项目经典入口文件

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

正式项目这个文件应该只包含1-3行,作为一个单独的顶层文件存在,避免存在未定义就使用的情况

2.中间件

flask app.py文件中能找到对应源码,常用的有如下一些

1.before_request
Registers a function to run before each request
2.before_first_request
Registers a function to be run before the first request to this instance of the application.
3.after_request
Register a function to be run after each request.
示例:
# app is your project app
@app.before_request
def process():
    print('test')

3.缓存

1.使用flask_caching

# demo
from flask import Flask
from flask_caching import Cache

config = {
    "DEBUG": True,          # some Flask specific configs
    "CACHE_TYPE": "SimpleCache",  # Flask-Caching related configs
    "CACHE_DEFAULT_TIMEOUT": 300
}
app = Flask(__name__)
# tell Flask to use the above defined config
app.config.from_mapping(config)
cache = Cache(app)

@app.route("/")
@cache.cached(timeout=50)
def index():
    return render_template('index.html')

优点是有存在的轮子,简单需求都能满足,不需要过多考虑,支持redis等存储,但是同时面对无法满足的需求时,提高了二次开发难度。

原理讲解,源码

以redis为例,根据源码中Cache.memoize可知主要逻辑如下:
1.先获取cache_key,顾名思义,这是缓存在redis中的key,以下为cache_key生成逻辑
updated = u"{0}{1}{2}".format(altfname, keyargs, keykwargs) # altfname为方法完整路径,keyargs和keykwargs为方法参数
cache_key = hashlib.md5()
cache_key.update(updated.encode("utf-8"))
cache_key = base64.b64encode(cache_key.digest())[:16]
cache_key = cache_key.decode("utf-8")
fetch_keys = [funcname + "_memver"] # funcname
version_data_list = list(self.cache.get_many(*fetch_keys)) # 为方法完整路径
if version_data_list[0] is None:
	version_data_list[0] = base64.b64encode(uuid.uuid4().bytes)[:6].decode("utf-8")
version = version_data_list[0]
cache_key = pre + cache_key + version # pre为自定义缓存前置

总结来说,生成两个缓存,一个为version,key为完整方法名+”_memver”,value为随机生成的字符串。

另一个为cache_key,key为自定义缓存前置+(方法完整路径+keyargs+keykwargs)加密+version,value为方法结果。

这两个缓存都会先去redis获取,获取不到再生成,其他细节比如过期时间等不再赘述。

第一个缓存value为第二个缓存key的一部分。

2.使用lru_cache

优点是自定义性高,缺点是功能单一,一般都需要在之上做一些开发。


Similar Posts

Comments