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
优点是自定义性高,缺点是功能单一,一般都需要在之上做一些开发。