“你那个短连结设计,”本忽然开口,“我当时听的时候就觉得有点意思。回去想了几天,越想越觉得那个预生成队列的思路挺巧。”
陈哲没说话。
本继续说:“一般人想到短连结,第一反应就是哈希、自增id、资料库。你想到的是成本,是cdn缓存,是预生成队列。这不是新手能想到的东西。”
他盯著陈哲,眼神里带著一点探究。
“你之前在哪家公司干过?”
“没干过。”陈哲说。
本的眉头微微皱了一下。
“那你在哪学的这些?”
陈哲想了想:“网上。看书。自己琢磨。”
本盯著他看了几秒,然后端起咖啡喝了一口。
“网上?”他放下杯子,“网上能学到这种程度?”
陈哲没说话。
本又沉默了几秒,然后换了个话题。
“你平时主要写什么语言?”
“python。”
“框架呢?”
“flask。最近在看django。”
本点点头:“flask入门快,django重型一点,適合大项目。你觉得这两个最大的区別是什么?”
陈哲想了想:“flask自由,django规范。flask让你自己选用什么库,django把一套东西都给你配好。flask適合快速原型和小项目,django適合团队协作和长期维护。”
本听著,点了点头。
然后他忽然问了一个问题:“flask的上下文是怎么实现的?”
陈哲愣了一下。
本等著他回答。
陈哲沉默了两秒,然后开始说:“flask有应用上下文和请求上下文。应用上下文存应用级別的配置和变量,请求上下文存当前请求的数据。它们用栈来管理,推入和弹出,保证每个请求都有自己的隔离空间。实现上用了localproxy和localstack,线程或者协程局部变量,避免互相干扰。”
本听完,沉默了几秒。
然后他又问:“那django的中间件是怎么工作的?”
陈哲想了想:“django的中间件是一个处理请求和响应的鉤子框架。请求进来的时候,会按顺序经过每个中间件的process_request方法,然后到视图函数,返回的时候再经过process_response。如果某个中间件返回了httpresponse对象,后面的就不走了。”
本盯著他,眉头微微皱了起来。
“你刚才说的那些,”他顿了顿,“是从哪看的?”
“flask源码。”陈哲说,“django文档。”
本沉默了几秒,然后端起咖啡喝了一口。
喝的时候,他呛了一下。
他把杯子放下,咳了两声,然后看著陈哲,眼神有点复杂。
“flask源码?”他重复了一遍,“你把flask源码读了?”