一日一技:【最新】再次突破CloudFlare五秒盾付费版
去年我写了一篇文章:一日一技:如何捅穿Cloud Flare的5秒盾 ,这篇文章使用的第三方库『cloudscraper』可以绕过免费版的五秒盾。但遇到付费版就无能为力了。
去年我写了一篇文章:一日一技:如何捅穿Cloud Flare的5秒盾 ,这篇文章使用的第三方库『cloudscraper』可以绕过免费版的五秒盾。但遇到付费版就无能为力了。
如果你在Flask中启动过子线程,然后在子线程中读写过g
对象或者尝试从request
对象中读取url参数,那么,你肯定对下面这个报错不陌生:RuntimeError: Working outside of request context.
.
例如下面这段Flask代码:
1 | import threading |
请求/start_thread
接口就会报错,如下图所示:
如果你在网上搜索flask thread RuntimeError: Working outside of request context.
,那么你可能会看到官方文档或者StackOverFlow上面提供了一个装饰器@copy_current_request_context
。如下图所示:
照着它这样写,确实能解决问题,如下图所示:
但无论是官网还是StackOverFlow,它的例子都非常简单。但是我们知道,启动线程有很多种方法,例如:
1 | # 方法一,启动简单线程 |
网上的方法只能解决第一种写法的问题。如果想使用方法2和方法3启动子线程,代码应该怎么写呢?如果在子线程中又启动子线程,再用一次@copy_current_request_context
还行吗?
相信我,你在网上搜索一下午,只有两种结果:一是找不到答案,二是找到的答案是晚于2023年1月14日的,因为是别人看了我这篇文章以后,再写的。
我们知道,在软件工程中,单元测试是保证软件质量的重要手段之一。一个优秀的代码,单元测试的代码量,经常会超过被测试的代码本身。一个理想化的开发团队,可能有三分之二的时间是在写测试,剩下的三分之一时间才是写业务代码。
在以前的文章中,在微信群中,我多次强调,写函数的时候,不要把所有参数放到一个大字典里面作为参数到处传,否则时间久了以后,根本不知道字典里面有哪些数据:
1 | def parse(data): |
上面这样写,对原作者来说确实简单,但是如果代码还有别人来维护,他就根本不知道这个字典里面有哪些数据。必须要一层一层查找调用链,费时费力。
我们有时候可能会需要把一个字符串转换成对应的类型。例如,把'123'
转换为int
类型的123
;或者把'3.14'
转成浮点数3.14
。
今天有同学在公众号粉丝群问了这样一个问题:
我的结论是:统计Bug率有意义。但是统计千行代码Bug率没有意义。
我们知道,在Python里面,可以使用input
获取用户的输入。例如:
但有一个问题,如果你什么都不输入,程序会永远卡在这里。有没有什么办法,可以给input
设置超时时间呢?如果用户在一定时间内不输入,就自动使用默认值。