python
thorraythorray
这个作者很懒,什么都没留下…
展开
-
ubunut20搭建离线OCR工具tesseract
【代码】ubunut20搭建离线OCR工具tesseract。原创 2023-01-05 16:11:45 · 274 阅读 · 0 评论 -
py2快速安装并启动jupyter
py2快速安装并启动jupyter。原创 2022-08-24 12:10:43 · 429 阅读 · 0 评论 -
基于jwt的web认证方案
jwt原创 2022-07-14 15:44:32 · 202 阅读 · 0 评论 -
python2搭建GRPC的依赖包
python2使用GRPC需要的包futures==3.3.0grpcio==1.41.1grpcio-tools==1.41.1protobuf==3.17.3protobuf版本过高会出现DecodeError: Truncated message的问题,降下来就ok了。原创 2022-05-31 10:16:45 · 423 阅读 · 0 评论 -
celery使用Automatic routing配置
需求:一个task文件中的不同消费者,通过不同的routing_key使用相同的队列里消费broker的消息。app = Celery('worker', broker=conf['BROKER_URL'])# task_queues定义了queue的名字和exchange的名字app.conf.task_queues = { 'new_queue': { 'exchange': 'ex', 'routing_key': 'task.#' # '#'表示all原创 2022-02-15 14:38:05 · 336 阅读 · 0 评论 -
DRF使用jwt对自定义Users表的认证
贴出settings,使用DRF的jwt插件是djangorestframework-simplejwt。AUTHENTICATION_BACKENDS重写User认证的AUTHENTICATION后端。DRF默认的是django自带的User表,如果只改AUTH_USER_MODEL全局变量,需要补充所有django.User带的属性,is_anonymous等。因为在后面的校验中会用到这些属性。DEFAULT_PERMISSION_CLASSES继承restframework的BasePerm原创 2022-01-18 13:43:58 · 1048 阅读 · 0 评论 -
协程和线程的爬虫性能对比
"""async spider"""import asyncioimport threadingimport timeimport requestsimport re, osimport aiohttpfrom aiofile import async_openclass BaseIO: def __init__(self, _output_dir, _reg): self._output_dir = _output_dir self._reg原创 2022-01-14 10:53:28 · 234 阅读 · 0 评论 -
DRF的权限认证逻辑
上图引用:https://www.cnblogs.com/hehecat/p/9349427.htmlDRF的View最终继承的是ModelViewSet,它继承了多个http action的mixin,并加入了get_object等方法,从而可以直接从定义类参数上完成对API的编写。使用ViewSet的好处就是可以直接复制路由。router.register(r'groups', views.GroupViewSet)但因为继承了ViewSetMixin重写了as_view方法,如果自己写路由.原创 2022-01-12 19:27:22 · 261 阅读 · 0 评论 -
单例模式和连接池
经常看见把SQL的连接写成单例模式,就认为可以节省内存开支和优化连接速度,更有认为这样会让数据库连接在高并发的情况下造成锁。其实并未真正体会到单例的使用场景。从连接数据库上来说,单例模式连接数据库分为两部分:得到数据库的认证和服务器信息-Datasource连接数据库-Connecting其实singleton只发生在第一步Datasource,只形成一个数据库配置实例。至于第二步Connecting和单例没有任何关系,而在高并发出现锁的时候推荐使用连接池才是正道。只有把Connecting写原创 2022-01-09 15:34:02 · 1221 阅读 · 0 评论 -
python partial的使用场景
functools.partial(func, *args, **keywords)Return a new partial object which when called will behave like func called with the positional arguments args and keyword arguments keywords. If more arguments are supplied to the call, they are appended to args..原创 2021-12-24 12:35:06 · 494 阅读 · 0 评论 -
flask中使用subquery完成中间表join连接
# 子查询select table_A_id as tableA.table_A_id, table_B_pass as tableB.pass, max_table_A_id as max(tableA.id) from tableA left outer join tableC ON tableC.xx_id = tableA.table_A_id left outer join tableB ON tableB.id = tableC.passwd_idleft outer join tabl原创 2021-10-08 12:49:01 · 266 阅读 · 0 评论 -
python3对于进制的转化
# ASCII转为16进制list_identity = ["{:02x}".format(c) for c in packet]# 16进制字符串转为ASCIIpacket = ''.join([chr(int("0x" + x, base=16)) for x in list_identity])# 任意进制转化"{:02x}".format(c)"{:02b}".format(c)"{:02o}".format(c)"{:02}".format(c)# 任意进制转化10进制i原创 2021-08-17 10:57:30 · 274 阅读 · 0 评论 -
python es批量插入数据
for form_item in forms.files: logger.info("form_item: %s", form_item) temp = property_file_upload_esbody(task_id, user, form_item) insert_es.append(temp) if len(insert_es) > 200: bulk(es_client, insert_es,...原创 2021-06-26 18:22:40 · 1682 阅读 · 0 评论 -
wtforms进行批量数据的自定义校验
from wtforms import Form, FormField, FieldListfrom app.error import bad_requestclass PropertyFileForm(BaseForm): ip = StringField(u'ip', [DataRequired()]) prod_version = StringField(u'设备型号', [DataRequired()]) port = StringField(u'端口', [Data原创 2021-06-07 16:31:02 · 206 阅读 · 0 评论 -
python celery的task-based-class写法
python celery的task-based class写法from celery import Celeryapp = Celery('worker')class NewTask(app.Task): name = 'worker.task.wifi' def run(self, **kwargs): passapp.tasks.register(NewTask)# 生产端NewTask().delay(**kwargs)这是celery1.0的写原创 2021-06-07 15:48:25 · 417 阅读 · 2 评论 -
python subprocess模块非阻塞交互
subprocess对子进程的运行可控,所以对于稍复杂的项目可以作为对os模块的替换。subprocess在主进程中启动一个子进程进行command的执行。其中提供的call,check_call,check_output等阻塞方法,是等待子进程全部执行完毕后,关掉子进程,接着执行主进程。其中call和check_call返回执行结果,而check_output将执行结果以字符串的形式返回。subprocess还提供了popen的子类,可以人为对子进程进行详细的控制。subprocess.wait(原创 2021-05-31 22:20:18 · 6158 阅读 · 3 评论 -
elasticsearch使用scroll做数据分页
from elasticsearch import Elasticsearches_client = Elasticsearch(hosts=ES_URL, timeout=600)query_data = es_client.search(index="xxx", scroll=scroll_tm, size=es_scroll_size, body=body) if query_data.get("hits").get("hits"): scroll_id = query_d原创 2021-05-27 18:07:03 · 661 阅读 · 0 评论 -
Dash实现多路由的跳转
在做项目的时候发现这个功能在官方文档中没有demo,网上博客的也很少,于是参考文档写了个大致的框架,其实dash的结构还是异步的处理方式,callback是数据处理的核心。多页面布局app.layout = html.Div([ dcc.Location(id='url', refresh=False), html.Div(id='page-content')])index_page = html.Div(children=[])detail_page = html.Div(chi原创 2021-05-15 17:17:05 · 1148 阅读 · 0 评论 -
yield异步编程
def fun_inner(): i = 0 while True: print(222) i = yield idef fun_outer(): a = 0 b = 1 inner = fun_inner() #在一个生成器函数未启动之前,是不能传递数值进去。必须先传递一个None进去或者调用一次next(g)方法,才能进行传值操作 inner.send(None) print(333) while Tr原创 2021-05-12 12:38:22 · 149 阅读 · 0 评论 -
创造新类和改变类行为
metaclass的意义对象实例化的过程:调用 _new_ 方法 ,创造实例调用 _init_ 方法 ,初始化实例在new方法中,可以对类就行实例化时的操作,例如单例模式在这里对其做了判断。class SingleMod: def __new__(cls): if hasattr(cls, "_instance"): return cls._instance cls._instance = super().__new__(cls)原创 2021-04-06 12:09:44 · 155 阅读 · 0 评论 -
python的多线程和协程的区别和应用
多线程python的多线程由于全局锁并不能并行,而是是单线程执行的分时复用模式。线程A占用CPU,获得GIL锁。遇到IO操作,中断,则释放锁。没遇到IO,则执行1000字节指令(py2)或者执行运行时间15ms,释放。根据竞态原则,抢到的线程会占用cpu,从新获得GIL。每个线程可能会由各种计算和IO操作组成,再整个执行过程中,cpu会因为上述原因不断地在各个线程之间切换,使得线程在执行IO的时候,cpu不会空等它结束而是去服务其他线程,这样就造成了多线程像是并行一样的效果。协程协程虽然原创 2021-03-19 00:15:06 · 1223 阅读 · 0 评论 -
简谈python中的__call__和类方法的使用场景
python的魔法方法__call__和实例方法,都可以实现一个功能,但是在哪种情况下应该使用呢?当类要表达它的多态,开放各类的需求api时候,使用类方法是比较好的。他的生命延展就像是一个不断分叉的树。但如果定义一个类最终只是向外暴露出一个api,剩下的类方法都为它服务的,那选择call我觉得合适一些。...原创 2021-01-27 13:44:18 · 780 阅读 · 1 评论 -
简析django源码中对csrf的处理
csrf跨站点请求伪造(Cross—Site Request Forgery),具体过程如下:用户登录后访问某网站A,将cookies存在浏览器。在未退出的情况下访问另一个网站B,这时候携带的信息就会全部发给B。网站B拿着你的信息又去访问A,这样就造成了跨站请求伪造。解决方案检验http headers中的Referer,它的内容就是这次http请求的网站地址。对于服务端来说,在请求头部信息里我们可以过滤出有害请求地址的黑名单。添加随机参数token,来每一次请求到来后,对比token值原创 2021-01-13 09:13:51 · 195 阅读 · 0 评论 -
浅谈python的工厂方法模式
在python的设计模式中,常用的还有工厂模式。工厂模式分为简单工厂模式,工厂模式,抽象工厂模式。其实就是对面向对象开发由浅入深,由具体到抽象的一种设计理念,它对代码有低耦合,避免重复工作。简单工厂模式简单的单类解决问题,写好类后,在工厂接口类在里通过判断区分到底应该实例化哪一个类。缺点在于每次实例化需要传参,而且添加新内容时候,判断中还需新入口词。开放-封闭原则。class Language: passclass English(Language): def speak(self):原创 2021-01-05 23:13:15 · 111 阅读 · 0 评论 -
简谈python中的mixin混合类
mixin是一种通用语言的设计模式,在python中指的就是多重继承。最近在看django2.0以上的源码时,发现主体框架都是mixin模式比较多,整体看起来非常有舒适感。因此想简单谈谈我对mixin使用的感悟。为什么要用mixin面向对象编程特点中的一个就是继承性,mixin是多重继承,难道是继承的时候多写了两个类就是mixin了么?先说结论,mixin指在继承原始类的功能下,把附加的不好抽象到父类的功能,写个新类出来继承,便是mixin。举个常用栗子:Class Bird: def paw(s原创 2020-12-29 14:05:11 · 511 阅读 · 0 评论 -
支付宝开放平台使用csr证书认证的python调用
支付宝开放平台的python sdk中没有支持csr模式的认证和请求,而且从官方文档中看到的价签步骤过于简单,有很多问题不能解释清楚。证书证书加密就是就是rsa加密更加高级可信的形式。什么是证书,是一种数字签名的声明,它将公钥的值绑定到持有对应私钥的个人、设备或服务的身份。大多数普通用途的证书基于 X.509v3 证书标准。那就清楚了,支付宝平台助手的csr工具会让你先填一些信息,这些信息就是证书的目的地,然后用rsa256生成一份不对称的秘钥,公钥写入证书,私钥需要留下来,这样限于你某个组织以及域名的原创 2020-12-28 19:44:30 · 730 阅读 · 0 评论 -
python2和python3的编码问题
首先说一点,python3将utf-8作为默认编码,也就是我们再也不用像2一样,在文件的开头先写一行:# encoding:utf-8这个习惯已经改不掉了,就像每个文件夹下写创建init文件一样。言归正常,我只说python3。转化str -> bytes : a.encode(“utf-8”)bytes -> str : a.decode(“utf-8”)pyhon3的bytes在python3里面,bytes是二进制,但也是各种编码格式被编后的类型。比如utf-8,gbk格原创 2020-12-25 20:39:54 · 328 阅读 · 0 评论 -
浅谈python3对多线程性能改进的一些理解
一个小实验python的多线程工作其实是分时复用,因为有GIL锁导致在某个时间段中只有一个线程在使用cpu,所以他难以发挥cpu多核的优势,这样也就导致python的多线程不适合执行计算密集的工作。而且重要的是在多线程中存在着数据安全的问题,我在近日使用的时候发现了2和3版本中的一些小差异,因此写了个例子来看看。import threading import timestart = time.time()num = 0def count(): global num for i原创 2020-11-30 22:15:07 · 519 阅读 · 1 评论 -
浅谈我对python中的monkey patch的理解
浅谈我对python中的动态补丁:monkey patch的理解和应用。最近也在帮助朋友处理一些问题的时候,对这个功能有有了进一步的了解。monkey patch是从“游击队”的英文guerrilla里转变过来的,他表面的意思其实和用户一点都不相关。他是一种处理机制,一种紧急的动态热修补很好的方法。改动量小,处理比较快速,适合于线上需求快速变化而不动底层的解决方案。在实际的运用中,经常会有调用底层类或者第三方包类时,对其功能不满足,从而需要改写的情况。这时候就可以对其进行patch。Foo.get_原创 2020-09-25 00:04:43 · 449 阅读 · 0 评论