Flask 中的 Context 初探
Flask 中的 Context 初探大家新年好!鉴于今年春晚非常好看,我觉得承受不起,于是来写点辣鸡水文娱乐下大家,这也是之前立的若干 Flag 中的一个 正文做过 Flask 开发的朋友都知道 Flask 中存在着两个概念,一个叫 App Context , 一个叫 Request Context 。 这两个算是 Flask 中很独特的一种机制。 从一个 Flask App 读入配置并启动开始,就进入了 App Context,在其中我们可以访问配置文件、打开资源文件、通过路由规则反向构造 URL。当 WSGI Middleware 调用 Flask App 的时候开始,就进入了 Request Context 。我们可以获取到其中的 HTTP HEADER 等操作,同时也可以进行 SESSION 等操作。 不过作为辣鸡选手而言,经常分不清为什么会存在这两个 Context ,没事,我们慢慢来说一说。 预备知识首先要清楚一点,我们要在同一个进程中隔离不同线程的数据,那么我们会优先选择 threading.local...
Supervisor 的一个隐藏坑
本垃圾 API 搬运工程师又来了啊,= =今天因为 Supervisor 一个隐藏的参数配置,造成了一个重要项目的线上崩溃。= =我觉得还是有必要分享一波,所以写了一篇垃圾水文。 起因写着写着代码,突然接到一堆报警邮件,让我直接觉得世界不那么可爱 然后定睛一看异常信息?卧槽?新建连接就马上传说中的 [Errno 24] Too many open files ??这搞你xxx啊,开始搞呗。 查 bug首先,众所周知,Linux 中万物皆文件= =,于是我们操作网络链接的过程,其实也就是操作 File Descriptor 的问题= =,诶,既然 Too many open files 那就优先考虑,是不是系统设置的阀值太小了,于是 ulimit -a 一把梭?? 诶?open files 一栏数字不小啊?足够啊?那这特么是什么鬼啊? 行吧,查一下网络连接吧, 一把梭,netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'...
Python concurrent.future 使用教程及源码初剖
垃圾话很久没写博客了,想了想不能再划水,于是给自己定了一个目标,写点 concurrent.future 的内容,于是这篇文章就是来聊聊 Python 3.2 中新增的 concurrent.future 模块。 正文Python 的异步处理有一个 Python 开发工程师小明,在面试过程中,突然接到这样一个需求:去请求几个网站,拿到他们的数据,小明定睛一想,简单啊,噼里啪啦,他写了如下的代码 1234567891011121314import multiprocessingimport timedef request_url(query_url: str): time.sleep(3) # 请求处理逻辑if __name__ == '__main__': url_list = ["abc.com", "xyz.com"] task_list = [multiprocessing.Process(target=request_url, args=(url,)) for url in...
你所不知道的 Flask Part1:Route 初探
前言我自己都记不清楚上一次写博客是什么时候了(笑),上一次挖的坑现在还没填完,干脆,开个新坑吧,你不知道的 Flask ,记录下自己用 Flask 过程中一些很好玩的东西,当然很大可能我又会中途弃坑 开篇引子之前遇到一个很奇怪的需求,需要在flask中支持正则表达式比如,@app.route('/api/(.*?)') 这样,在视图函数被调用的时候,能传入 URL 中正则匹配的值。不过 Flask 路由中默认不支持这样的方法,那么我们该怎么办?我们先思考五分钟吧? 好了,我先给出解决方案吧 12345678910from flask import Flaskfrom werkzeug.routing import BaseConverterclass RegexConverter(BaseConverter): def __init__(self, map, *args): self.map = map self.regex = args[0]app =...
asyncio 笔记
来源 annotated-py-asyncio 阅读补充:1. 基本概念:1.1 协程: “协程 是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序”。 从技术的角度来说,“协程就是你可以暂停执行的函数”。 如果你把它理解成“就像生成器一样”,那么你就想对了。 1.2 事件循环: 事件循环 “是一种等待程序分配事件或消息的编程架构”。 基本上来说事件循环就是,“当A发生时,执行B”。 或许最简单的例子来解释这一概念就是用每个浏览器中都存在的JavaScript事件循环。 当你点击了某个东西(“当A发生时”),这一点击动作会发送给JavaScript的事件循环,并检查是否存在注册过的 onclick 回调来处理这一点击(“执行B”)。 只要有注册过的回调函数就会伴随点击动作的细节信息被执行。 事件循环被认为是一种循环是因为它不停地收集事件并通过循环来发如何应对这些事件。 1.3 Python 的事件循环: 对 Python 来说,用来提供事件循环的 asyncio 被加入标准库中。 asyncio...
写在黎明之前
年少之成绩,或有时而可商,年少之作为,或有时而可讨,为此独立之精神,与自由之思想,纵历百十年整,亦与沱江水长流,共三光而永光 其实突然发现,没写过点什么特殊的文字,来纪念自己这一年。 今天,2月10日,距离离职完毕还有五天,距离离开成都还有11天,距离入职,还有17天。坐在自己屋子里,看着窗外的云和雨雾,慢慢的,用一点东西,来纪念自己过去的一年。 云起 Hey man, think about this world and go fuck it 16年,一开年,便遭受了一个算是影响未来的挫折吧。现在想想,从1年6个月的感情里脱身出来并不是一件很容易的事情。更何况,遇到太多的事情让我更为烦心。 其实在大学尾声的时候,来回顾自己这四年,可能也更多的算是一个 loser 吧,竞赛失败。专业课挂科四分之一,延期毕业。不过心高气傲的我,还是不喜欢自己被同为一群 loser 的人所鄙视。这种感觉不是太好。 在师父的教育下,慢慢的入了 Python...
听说你会 Python (2):Python 高阶数据结构解析
前言之前写过一篇《听说你会 Python ?》的文章,大家反响都还不错,那么我想干脆把这个文章做成一个系列,继续讲解一下 Python 当中那些不为人知的细节吧。然后之前在和师父川爷讨论面试的时候,川爷说了一句“要是我,我就考考你们怎么去实现一个 namedtuple ,好用,方便,又能区分人”,说者无心,听者有意,我于是决定在这次的文章中,和大家聊一聊 Python 中一个特殊的高阶数据结构, namedtuple 的实现。 Let’s beginnamedtuple介绍tuple 是 Python 中 build-in 的一种特殊的数据结构,它是一种 immutable 的数据集合,我们经常会这样使用它 123456789def test(): a = (1, 2) print(a) return aif __name__ == '__main__': b, c = test() print(a) Right,很多时候我们会直接使用 tuple 来进行一些数据的 packing/unpacking 的操作。OK,关于...
用 Python 实现一个最简单的对象模型
原文地址:A Simple Object Model 原文作者:Carl Friedrich Bolz 译文出自:掘金翻译计划 译者:Zheaoli 校对者:Yuze Ma, Gran 一个简单的对象模型Carl Friedrich Bolz 是一位在伦敦国王大学任职的研究员,他沉迷于动态语言的实现及优化等领域而不可自拔。他是 PyPy/RPython 的核心开发者之一,于此同时,他也在为 Prolog, Racket, Smalltalk, PHP 和 Ruby 等语言贡献代码。这是他的 Twitter @cfbolz 。 开篇面向对象编程是目前被广泛使用的一种编程范式,这种编程范式也被大量现代编程语言所支持。虽然大部分语言给程序猿提供了相似的面向对象的机制,但是如果深究细节的话,还是能发现它们之间还是有很多不同的。大部分的语言的共同点在于都拥有对象处理和继承机制。而对于类来说的话,并不是每种语言都完美支持它。比如对于 Self 或者 JavaScript...
听说你会 Python ?
前言最近觉得 Python 太“简单了”,于是在师父川爷面前放肆了一把:“我觉得 Python 是世界上最简单的语言!”。于是川爷嘴角闪过了一丝轻蔑的微笑(内心 OS:Naive!,作为一个 Python 开发者,我必须要给你一点人生经验,不然你不知道天高地厚!)于是川爷给我了一份满分 100 分的题,然后这篇文章就是记录下做这套题所踩过的坑。 1.列表生成器描述下面的代码会报错,为什么? 1234567class A(object): x = 1 gen = (x for _ in xrange(10)) # gen=(x for _ in range(10))if __name__ == "__main__": print(list(A.gen)) 答案这个问题是变量作用域问题,在 gen=(x for _ in xrange(10)) 中 gen 是一个 generator ,在 generator 中变量有自己的一套作用域,与其余作用域空间相互隔离。因此,将会出现这样的 NameError: name 'x' is...
Swift 声明式程序设计
原文地址:Declarative API Design in Swift 原文作者:Benjamin Encz 译文出自:掘金翻译计划 译者:Zheaoli 校对者:luoyaqifei, Edison-Hsu 在我第一份 iOS 开发工程师的工作中,我编写了一个 XML 解析器和一个简单的布局工具,两个东西都是基于声明式接口。XML 解析器是基于 .plist 文件来实现 Objective-C 类关系映射。而布局工具则允许你利用类似 HTML 一样标签化的语法来实现界面布局(不过这个工具使用的前提是已经正确使用 AutoLayout & CollectionViews)。 尽管这两个库都不完美,它们还是展现了声明式代码的四大优点: 关注点分离: 我们在使用声明式风格编写的代码时声明了意图,从而无需关注具体的底层实现,可以说这样的分离是自然发生的。 减少重复的代码: 所有声明式代码都共用一套样式实现,这里面很多属于配置文件,这样可以减少重复代码所带来的风险。 优秀的 API 设计: 声明式 API...